我已阅读this blog,它显示了算法如何使用numpy提高250倍速度。我曾尝试使用numpy的改善以下代码,但我不能让它工作:如何使用numpy提高python代码性能
for i in nodes[1:]:
for lb in range(2, diameter+1):
not_valid_colors = set()
valid_colors = set()
for j in nodes:
if j == i:
break
if distances[i-1, j-1] >= lb:
not_valid_colors.add(c[j, lb])
else:
valid_colors.add(c[j, lb])
c[i, lb] = choose_color(not_valid_colors, valid_colors)
return c
说明
上面的代码是用来计算自相似尺寸的算法的一部分一张图。它基本上通过构建双图G'来工作,其中如果两个图之间的距离大于或等于给定值(Lb),则节点与其他节点相连,然后计算这些双网上的图着色。
该算法描述如下:
- 从1分配一个唯一的ID N到所有网络节点,而不分配任何颜色爱好。
- 对于所有Lb的值,颜色值0分配给具有ID,IE C_1l
- 值= 1 = 0设置的ID I = 2。重复以下的节点,直到I = N.
- a)计算从i到网络中所有节点的距离l_ij,id j小于i。 c)从l_ij≥Lb的所有节点j < i中选择一个未使用的颜色C [j] [l_ij]。这是给定Lb值的节点i的颜色C [i] [Lb]。
- d)将Lb增加1并重复(c)直到Lb = Lb_max。
- e)通过1
我wrote it in python增加I,但它需要一分钟以上时尝试与具有100个节点和p = 0.9小型网络中使用它。
因为我还是新来的python和numpy,我没有找到提高效率的方法。
是否可以通过使用numpy.where找到路径比给定Lb更长的路径来删除循环?我试图实现它,但没有奏效...
但是在SO上比在CR上有更多'numpy'知识丰富的海报。 CR对问题格式也很挑剔。 '矢量化'是SO'numpy'的共同话题。 – hpaulj
'numpy'可以加速很多事情,如果你的问题在本质上是平行的 - 对一个元素做同样的事情,不管顺序如何。但如果问题是连续的 - 第i个元素的行为取决于先前对'i-1'的行为,那么'numpy'通常不起作用。 – hpaulj
同意@hpaulj询问表现,在此处向量化相关问题。同样对于OP来说,如果代替集合,列表或甚至更好的情况下使用numpy数组,当查看向量化代码时会更容易。 – Divakar