[英]How can I improve python code performance using numpy
我已经阅读了该博客 , 该博客显示了如何通过使用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),则一个节点彼此连接,然后在这些对偶网络上计算图的着色。
算法描述如下:
我用python编写了它,但是尝试在具有100个节点且p = 0.9的小型网络上使用它需要一分多钟。
由于我还是python和numpy的新手,所以没有找到提高其效率的方法。
是否可以使用numpy.where删除循环,以找出路径比给定Lb长的地方? 我尝试实现它,但是没有用...
如果要转到numpy,则可以将列表更改为数组,例如,在将distances[i-1, j-1]
声明为numpy数组后distances[i-1, j-1]
distances[i-1][j-1]
变为distances[i-1, j-1]
。 与c[i][lb]
。 关于valid_colors
和not_valid_colors
您应该多考虑一点,因为对于numpy数组,您无法追加内容:该数组具有固定的长度,因此您应该在此之前固定一个最大大小。 另一个想法是,在将所有内容放入numpy之后,您可以对代码http://docs.cython.org/src/tutorial/cython_tutorial.html进行cythonize处理,这意味着所有循环都将变得非常快。 无论如何,如果您不想要cython并查看博客,您会看到在main()
中将distances
声明为数组
使用numpy数组进行矢量化运算的速度很快,因为实际的计算是使用BLAS和LAPACK等基础库完成的,而没有Python开销。 使用循环密集型操作,您将看不到这些好处。
通常,您必须找出一种向量化操作的方法(通常可以通过巧妙地使用数组切片来实现)。 但是,某些操作本质上是循环密集型的,有时对它们进行矢量化并不容易(对于您的代码来说似乎是这种情况)。
在这种情况下,您可以先尝试Numba ,它无需任何修改即可从Python函数生成优化的机器代码。 (您只需注释该功能,它将自动为您完成该功能)。 我没有很多经验,也没有尝试将其用于复杂功能。
如果这不起作用,则可以使用Cython ,后者将类似Python的代码(带有类型变量)自动转换为高效的C代码,并生成一个Python扩展模块,您可以在Python中导入和使用它。 对于循环密集型操作,这通常至少会提高一个数量级(通常为两个数量级)。 我通常认为Cython易于使用,因为与纯C不同,Cython可以直接在Cython代码中访问numpy数组。
我建议使用Anaconda Python发行版 ,因为您将能够轻松安装这些软件包。 抱歉,您的代码没有具体答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.