假设我们有一个具有以下属性的图:
我有两个函数可以使图形变大:
def ring_graph1(n, k):
graph = nx.Graph()
sources = np.arange(n)
for i in range(1, k + 1):
targets = np.roll(sources, i)
graph.add_edges_from(zip(sources, targets))
return graph
def ring_graph2(n, k):
graph = nx.Graph()
for i in range(n):
sources = [i] * k
targets = range(i + 1, i + k + 1)
targets = [node % n for node in targets]
graph.add_edges_from(zip(sources, targets))
return graph
我天真地认为第一个会更快,因为它处理np.array
,并且一次性分配更少的内存,而且因为k<;n它分配的内存更少
但测量结果表明:
times1 = []
times2 = []
for k in [2, 10, 50, 100, 200, 500]:
t = %timeit -o ring_graph1(1000, k)
times1.append(t.average)
t = %timeit -o ring_graph2(1000, k)
times2.append(t.average)
听起来瓶颈似乎是内置的
add_edges_from
,而不是边缘生成。这可能是意料之中的,因为networkx
设计用于处理更复杂的情况,例如边缘属性。事实上,有一个内置的方法可以让你构造环图,例如相当于
但是内置版本实际上比您的版本慢
回到边缘生成,考虑以下实现:
在这两种情况下,边缘生成占用的运行时间都少于10%
不管它值多少钱
在不必进行模传递的情况下,传递速度更快(n=1000,k=500):
Numpy魔术编辑
经过一点工作后,将以更快的速度返回同一组边对:
相关问题 更多 >
编程相关推荐