Какая самая быстрая итерация в большом сетевом экземпляре DiGraph networkx? - PullRequest
1 голос
/ 14 января 2011

Я пишу класс, который наследуется от DiGraph.py из пакета с открытым исходным кодом networkx в python.

В некоторых методах в моем классе мне нужно искать узлы с определенными степенями (выходами или степенями)для ориентированного графа) и верните их.

Этот класс должен использоваться с проектом интеллектуального анализа данных \ обработки естественного языка, он будет использоваться в очень больших сетях.мне нужна быстрая реализация описанного метода (возврат списка узлов с определенной степенью выхода или определенной степенью).

В суперклассе уже определена пара вещей: 1. метод network.outdegree(): возвращает словарь с ключами узла и значениями выходных данных.

{'school': 4, 'middle school': 0, 'university': 0, 'commercial': 0, 'private': 5, 'institution': 2, 'high school': 0, 'college': 0, 'elementary school': 0, 'central': 0, 'company': 0, 'public': 3, 'bank': 2}
  1. метод, который является

network.out_degree_iter ()

<generator object out_degree_iter at 0x02EEB328>

Я не знаю, как использовать этот метод. Если кто-то может объяснить, как это используется, я буду благодарен.

3. У меня есть атрибут network.nodes, который представляет собой список всех узлов вмоя сеть.

Вопрос: я могу выполнить итерацию по всем узлам и, например, вернуть те, у которых есть степень 2, путем составления списка на узлах network.nodes, или я могу выполнить итерацию по своему словарю и вернуть списокузлы со значениями 2, или, может быть, используют out_degree_iter(), который я не знаю, как он используется или чем он отличается от итерации по элементам словаря в цикле for (для k, v в dict.iteritems ()) ??Какой из них будет быстрее для очень большой сети узлов и ребер и ПОЧЕМУ?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 января 2011

Самый простой способ - использовать метод out_degree_iter () с пониманием списка, как вы предложили. Вот как:

import networkx as nx
G=nx.DiGraph(nx.gnp_random_graph(1000,0.001))
t1=[n for n,k in G.out_degree_iter() if k==2

Самый быстрый способ требует доступа к внутренней структуре данных:

t2=[n for n,nbrs in G.succ.items() if len(nbrs)==2]

Для нас в степени in_degree_iter () и G.pred.items ().

Вот некоторые времена

In [41]: %timeit t1=[n for n,k in G.out_degree_iter() if k==2]
1000 loops, best of 3: 368 us per loop

In [42]: %timeit s2=[n for n,nbrs in G.succ.items() if len(nbrs)==2]
1000 loops, best of 3: 198 us per loop
2 голосов
/ 14 января 2011

Итераторы лучше подходят для больших графов, потому что вы не создаете копию словаря. Как насчет чего-то вроде этого:

list_of_2 = []
for g in G.out_degree_iter():
    if g[1]==2:
        list_of_2.append(g[0])

Или,

list_of_2 = map(lambda x:x[0],filter(lambda x:(x[1]==2),G.out_degree_iter()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...