【发布时间】:2016-01-14 05:50:44
【问题描述】:
我读过this blog,它展示了一个算法如何通过使用 numpy 实现 250 倍的加速。我曾尝试使用 numpy 改进以下代码,但无法使其工作:
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 到 N 的唯一 ID,但尚未分配任何颜色。
- 对于所有 Lb 值,将颜色值 0 分配给 id=1 的节点,即 C_1l = 0。
- 设置 id 值 i = 2。重复以下操作,直到 i = N。
- a) 计算从 i 到网络中 id j 小于 i 的所有节点的距离 l_ij。
- b) 设置 Lb = 1
- c) 从 l_ij ≥ Lb 的所有节点 j
- d) 将 Lb 增加 1 并重复 (c) 直到 Lb = Lb_max。
- e) 将 i 增加 1。
我 wrote it in python 但尝试将它用于具有 100 个节点且 p=0.9 的小型网络时需要一分钟以上。
由于我还是 python 和 numpy 的新手,我没有找到提高其效率的方法。
是否可以通过使用 numpy.where 找到路径比给定 Lb 长的位置来删除循环?我试图实现它,但没有奏效......
【问题讨论】:
-
但是在 SO 上的
numpy知识渊博的海报比在 CR 上的要多得多。 CR 也往往对问题格式非常挑剔。 “矢量化”是 SOnumpy上的一个常见话题。 -
numpy如果您的问题本质上是平行的,则可以大大加快处理速度 - 对元素执行相同的操作,无论顺序如何。但如果问题是串行的——第 i 个元素的动作取决于之前对“i-1”的动作,那么numpy通常无济于事。 -
同意@hpaulj 提出的性能问题,在此处矢量化相关问题。同样对于 OP,如果在寻找矢量化代码时使用 numpy 数组而不是集合、列表甚至更好,会更容易。
-
请添加
nodes和distances的最小示例,并尝试使用 numpy 进行矢量化。 -
使用
for j in nodes[:i]比使用显式if ... then break更符合 Python 风格。
标签: python algorithm python-3.x numpy optimization