2011-01-14 13 views
1

PythonでオープンソースのnetworkxパッケージからDiGraph.pyを継承したクラスを作成しています。DiGraph networkxの大規模なネットワークインスタンスで最も速いのは何ですか?

私のクラスのいくつかのメソッドでは、特定の度数(有向グラフの場合はoutcomeまたはindegrees)のノードを検索して返す必要があります。

このクラスは、データマイニングプロジェクト\自然言語処理で使用され、非常に大きなネットワークで使用されます。私が必要とするのは、記述されたメソッドの速い実装です(ある程度のノードまたはある程度のノードのリストを返します)。

すでにスーパークラスで定義されていることがいくつかあります。 1.メソッドnetwork.outdegree(): は、ノードキーとアウトデュレーション値を持つ辞書を返します。私はこの方法を使用する方法がわからない

<generator object out_degree_iter at 0x02EEB328> 

network.out_degree_iter()である

{'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. 方法は、誰かがそれを使用する方法を説明することができた場合、 私は感謝するでしょう。

    3.私の属性network.nodesは、ネットワーク内のすべてのノードのリストです。

    質問:たとえば、network.nodesでリストの理解を行うことで、すべてのノードを反復してoutdegree 2を返すことができます。または、辞書を繰り返して、値2、あるいは、私はそれがどのように使われているのかわからないout_degree_iter()を使うか、forループの辞書項目を反復するのとどのように違うのですか?(dict.iteritems()のk、v)??ノードとエッジとの非常に大きなネットワークでは、どちらの方が高速でしょうか?あなたは辞書のコピーを作成していないので、

    おかげ

+1

ジェネレータオブジェクトがイテレータであるいくつかのタイミングであり、それは、forループで使用されるべきです。例えばin network.out_degree_iter()の場合:aを出力します。 list(network.out_degree_iter())はリストをジェネレータから生成する必要があります。 – BatchyX

+1

プロジェクトのサイズによっては、すべてのデータが使用可能なメモリに収まるかどうかを考慮する必要があります。データの一部を取得するためにページングする必要が生じた場合、それはかなりのオーバーヘッドをもたらす可能性があります。残念ながら、私はDiGraphクラスについて十分に知りません。 – mklauber

答えて

2

最も簡単な方法は、あなたが提案したように、リスト内包表記でout_degree_iter()メソッドを使用することです。ここではどのように:)(中度の私たちにとって

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

in_degree_iter)とG.pred.items(:

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 

最速の方法は、内部データ構造へのアクセスが必要です。ここ

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())) 
関連する問題