2017-06-21 2 views
0

Je suis en train d'examiner un système de travail pour identifier les zones qui peuvent être optimisées. J'ai trouvé que la boucle augmente en dessous de la durée de fonctionnement d'environ 70%Mise à jour de la capacité en python igraph

for t in G.get_edgelist(): 
    eid = G.get_eid(*t) 
    origin = G.vs[t[0]]['name'] 
    destin = G.vs[t[1]]['name'] 

    if fc.cpdict[origin]['node_type'] == 'dependency': 
     cp_func[nodes.index(destin)] *= cp_func[nodes.index(origin)] 

    cap = cp_func[nodes.index(origin)] 
    G.es[eid]["capacity"] = cap 

Le système a besoin de mettre à jour la capacité des bords qui ont changé depuis la dernière itération du temps de modèle. Dans why-is-add-edge-function-so-slow-ompared-to-add-edges, une réponse indique

La raison est que igraph utilise une liste de bords indexés comme structure de données dans la couche C. L'index permet d'interroger les voisins d'un sommet spécifique en temps constant. C'est bon si votre graphique change rarement, mais cela devient un fardeau quand les opérations de modification sont beaucoup plus fréquentes que les requêtes, puisque chaque fois que vous ajoutez ou supprimez un bord, vous devez mettre à jour l'index.

Existe-t-il une meilleure façon de faire cette mise à jour.

Répondre

0

Si quelqu'un d'autre recherche de l'aide ou a une meilleure solution. Après avoir examiné la documentation que je suis allé avec les modifications suivantes:

def update_capacity(self, components, comp_sample_func): 
     for comp_index, (comp_id, component) in enumerate(components.iteritems()): 
     for dest_index, dest_comp_id in enumerate(component.destination_components.iterkeys()): 
      if component.node_type == 'dependency': 
       comp_sample_func[dest_index] *= comp_sample_func[comp_index] 

      edge_id = self.comp_graph.get_eid(comp_id, dest_comp_id) 
      self.comp_graph.es[edge_id]['capacity'] = comp_sample_func[comp_index] 

J'ai créé les noeuds avec le même ordre que mon dictionnaire ordonné, puis récupéré les Vertice avec les indices. Cela a donné une amélioration de 10-20%.