如何在networkx中高效生成多个具有随机边权的随机图

3

我想生成多个具有随机边权值的Erdos-Renyi图。然而,因为代码中有两个嵌套循环,所以我的代码运行速度非常慢。我想知道是否有人可以帮助我改进代码。

import networkx as nx
import random

#Suppose I generate 1000 different random graphs
for _ in range(1000):
    #Let's say I will have 100 nodes and the connection probability is 0.4
    G= nx.fast_gnp_random_graph(100,0.4)
    #Then, I assign random edge weights.
    for (u, v) in G.edges():
            G.edges[u,v]['weight'] = random.randint(15,5000)

当我在R中使用igraph运行类似的代码块时,无论网络大小如何,它都非常快。有哪些替代方法可以完成相同的任务而不会遇到执行时间缓慢的问题?


只是检查 nx.nx.fast... 是否是打字错误。 - Joel
很遗憾,这里没有太多可以做的... Networkx是一个缓慢的库。将函数包装成快速库(如Numpy)的数据结构来转换图形是如此缓慢,以至于使用它们在性能方面实际上完全没有意义...例如,对100x100数组进行简单的转换需要3毫秒,而理论上它可以(至少)快100倍!我只能建议您使用另一个库... - Jérôme Richard
@JérômeRichard 感谢您的详细解释。您能告诉我除了“networkx”之外,还可以使用哪些库吗? - sergey_208
1个回答

1

这个基准测试展示了许多图形库(来自不同的编程语言)的性能。它证实了NetworkX非常缓慢。graph-tool Python包似乎是一个明显更快的替代品。请注意,给定软件包的性能取决于您想要实现什么,因为图形算法的性能非常依赖于所选择的内部表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接