2017-02-03 38 views
1

Я работаю с AI, и один из моих алгоритмов должен работать с добавлением и удалением ребер. Я могу сделать это с помощью igraph, но моя проблема: это слишком медленно.Ускоренный способ удаления края по индексу вершин [igraph Python]

Если я работаю с двумя словарями, я могу запустить свой код в 0.2 с. Но с графиком я беру более 5 с. И я не знаю, как улучшить производительность кода.

Код, приведенный ниже, является частью алгоритма. Это удаляет все ребра между двумя списками вершин. Кто-нибудь знает, как это сделать с лучшей производительностью?

for vertexI in self.vertexSI: 
    for vertexJ in self.vertexSJ: 
     try: 
      nOfLoops += 1 
      edgeID = self.g.get_eid(vertexI.index, vertexJ.index) 
      self.g.delete_edges(edgeID) 
     except Exception as e: 
      nOfErrors += 1 

Спасибо.

ответ

2

Структуры данных igraph оптимизированы для быстрых запросов, но не так быстро обновляются. В графе igraph есть несколько структур данных, которые нужно обновлять/переиндексировать, когда вы добавляете вершину, удаляете вершину, добавляете ребро или удаляете ребро. Во многих случаях удаление одного края почти так же дорого, как удаление из них из них за один проход.

Например, если я правильно понял, ваша цель выше - удалить все ребра, которые попадают между двумя группами вершин (self.vertexSI и self.vertexSJ). Вы можете сделать это, как вы делали это выше, но это будет очень медленно, так как вы удаляете края один за другим. Вы можете ускорить его, собирая идентификаторы краев, чтобы сначала удалить их в список, а затем позвонить self.g.delete_edges() с этим списком в конце. Но есть еще более простой однострочный (при условии, что ваш график неориентирован):

self.g.es.select(_between=(self.vertexSI, self.vertexSJ)).delete() 
+0

Hi, Tamás. Как вы говорите, добавление/обновление графика igraph происходит слишком медленно, даже используя строку кода выше. Мое решение выполняло все изменения с использованием только диктаторов и воссоздало новый объект igraph. Для меня это идеально для меня. Теперь я могу делать все, что хочу, с помощью простых структур, и я могу отлаживать и использовать функции обнаружения сообщества из igraph. Большое спасибо за ваш ответ и эту удивительную библиотеку! –