2011-01-14 16 views
1

我正在編寫一個從python中的開源networkx包中繼承DiGraph.py的類。什麼是DiGraph networkx的大型網絡實例中最快的迭代?

在我班的某些方法中,我需要搜索具有某種程度的節點(有向圖的outdegrees或indegrees)並返回它們。

本課程將與數據挖掘項目\自然語言處理一起使用,它將用於極其龐大的網絡。我需要的是快速實現所描述的方法(返回具有一定出度或某種度數的節點的列表)。

有一對夫婦在超類中已經定義的東西: 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是我網絡中所有節點的列表。

問題:我可以迭代所有節點,並通過outdegree 2返回那些例如通過在network.nodes上執行列表理解,或者我可以迭代我的字典並返回值爲2的節點列表,或者可能使用out_degree_iter(),我不知道它是如何使用的,或者它是如何在for循環中迭代字典項目(對於d,dict.iteritems()中的k,v)有什麼不同?對於非常大的節點和邊緣網絡,其中哪一個會更快,爲什麼?

謝謝

+1

一個生成器對象是一個迭代,它應該與一個for循環中使用。例如在network.out_degree_iter()中輸入:print a。或者,list(network.out_degree_iter())應該從生成器中創建一個列表。 – BatchyX 2011-01-14 18:06:01

回答

2

最簡單的方法是,你建議用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

迭代器對大圖更好,因爲您不構造字典的副本。怎麼樣是這樣的:

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())) 
相關問題