2016-03-24 4 views
2

印象的なperformance comparisonを見てから、グラフツールを試してみることにしました。比較のために、私は両方のパッケージを使用してランダムなツリーを生成するコードを書きました。GraphxはNetworkxに比べて驚くほど遅い

グラフツールコード:

import numpy as np 
import graph_tool.all as gt 

# construct an initial graph with two nodes and one link 
n = 5000 
G = gt.Graph(directed = False) 
G.add_edge(0, 1) 

for t in range(2, n): 
    # connect the new vertex to one of the old vertices randomly 
    G.add_edge(np.random.choice(range(t)), t) 

Networkxコード:

import networkx as nx 
import numpy as np 

n = 5000 
# initial graph 
G = nx.Graph() 
G.add_edge(0, 1) 

for t in range(2, n): 
    G.add_edge(t, np.random.choice(range(t))) 

networkxがオン2秒未満を要するのに対し、グラフツールは、私の4コアマシン上で約14秒かかり同じマシン!私は明白な何かを欠いていますか

ありがとうございます。

+0

をですべてのエッジを追加し、一度の代わりに、1つずつであっても高速になります(例えば、既存のグラフの検索をたくさん行うなど)他のユースケースよりも遅いです。 – Blckknght

+0

実際に私はこれでもっと複雑なコードを実行していますが、networkxは私にとってより良いパフォーマンスを提供しています。 (この1つ:http://link.springer.com/article/10.1140/epjb/e2015-60501-y#page-1) – Peaceful

+0

ネットワークの初期化について何か遅いことがありますか? – Joel

答えて

12

ここには何も驚くことはありません。 graph-toolは、メインループをC++にロードすることにより、より大きなパフォーマンスを実現します。すべてのメインループがPythonに含まれていれば、利点はありません。 numpyのような他のライブラリについても同じことが当てはまります。

エッジの高速追加を実現する適切な方法は、graph-toolにメインループを実行させることです。あなたが生成しているネットワークは、単純な成長モデルで、呼び出すことで、グラフツールで達成することができます。

N = 5000のための私のコンピュータでは約15ミリ秒かかり
G = price_network(n, gamma=0, directed=False) 

各繰り返しですべての頂点を持つ新しいリストを作成するので、Pythonコードが不必要に遅いことにも注意してください。はるかに高速バージョンは次のようになります。

from numpy.random import randint 
n = 5000 
G = Graph(directed=False) 
G.add_vertex(n) 
G.add_edge(0, 1) 
for i in range(2, n): 
    G.add_edge(i, randint(i)) 

n個のより大きな値の場合、それは私が追加することを推測すなわち、

from graph_tool.all import * 
from numpy.random import randint 
n = 5000 
G = Graph(directed=False) 
edges = [(0, 1)] 
for i in range(2, n): 
    edges.append((i, randint(i))) 
G.add_edge_list(edges) 
+0

はい。今私はその問題を理解しています。しかし、私はいくつかの一般化されたグラフをどのように構築するのですか?たとえば、優先的なアタッチメントモデルでは、明らかにすべてのエッジを一度に追加することはできません。また、私は実際には、新しいノードの数が現在のネットワークサイズの何分の1かであるネットワークをシミュレートしたいので、すべてのノードを同時に追加することはできません。そうですか?ありがとう – Peaceful

+0

多くのノードのタスクを同時に効率的に達成する方法について教えてください。お返事ありがとうございます。 – Peaceful

+0

@Peaceful、これを回避しましたか? – user1712447

関連する問題