Python 与Networkx相比,图形工具速度惊人地慢

Python 与Networkx相比,图形工具速度惊人地慢,python,networkx,graph-tool,Python,Networkx,Graph Tool,在看到令人印象深刻的图形后,我决定尝试使用图形工具。为了进行比较,我编写了代码来使用这两个包生成一个随机树 图形工具代码: 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):

在看到令人印象深刻的图形后,我决定尝试使用图形工具。为了进行比较,我编写了代码来使用这两个包生成一个随机树

图形工具代码:

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)))
图形工具在我的4核机器上大约需要14秒,而networkx在同一台机器上不到2秒!我错过了什么明显的东西吗


提前谢谢。

这里没有什么令人惊讶的。图形工具通过将主循环卸载到C++来实现更高的性能。如果所有的主循环都是Python,那么它没有任何优势。其他库(如numpy)也是如此

实现快速添加边的正确方法是让graph tool执行主循环。您正在生成的网络是一个简单的增长模型,可以在图形工具中通过调用:

G = price_network(n, gamma=0, directed=False)
在我的计算机中,n=5000大约需要15毫秒

还要注意,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)

我猜,一个接一个地添加边比其他一些用例(例如,对预先存在的图形进行大量搜索)要慢。实际上,我用它运行了更复杂的代码,但networkx给了我更好的性能。(这一个:)是不是初始化网络的速度太慢了?不是。我正在打印这些时间
t
,在图形工具中,我可以看到随着
t
变大,这些时间打印得越来越慢。是的。现在我明白了。但是我如何构造一些广义图呢?例如,对于优先连接模型,我显然不能一次添加所有边。另外,我实际上想模拟一个网络,其中新节点的数量是当前网络大小的一小部分,因此我不能同时添加所有节点。是这样吗?谢谢,请指导我如何同时高效地完成多个节点的任务?Thanks@Peaceful,你绕过了吗?@user1712447蒂亚戈的回答很有帮助。