如何在Python中提高以下代码的性能?
基本上,它所做的是在如何在Python中提高以下代码的性能?,python,numpy,Python,Numpy,基本上,它所做的是在s数组中定位dE[i,j]的值,并向该位置添加相应的值(n[j]+1)*i[i,j]。有没有办法避免for循环?从技术上讲,你可以在it中使用for i,j.product(range(N),range(M)):do_something(),但老实说,瓶颈是argmin和循环的时间复杂度:由于你的算法设计,你的速度很慢。如果可能的话,考虑寻找重构的方法,或者如果性能令人望而却步而无法重构的话,可以用C编写一个扩展 如果性能不是瓶颈,雅格尼:你不会需要它的。过早的优化是万恶之源
s
数组中定位dE[i,j]
的值,并向该位置添加相应的值(n[j]+1)*i[i,j]
。有没有办法避免for循环?从技术上讲,你可以在it中使用for i,j.product(range(N),range(M)):do_something()
,但老实说,瓶颈是argmin
和循环的时间复杂度:由于你的算法设计,你的速度很慢。如果可能的话,考虑寻找重构的方法,或者如果性能令人望而却步而无法重构的话,可以用C编写一个扩展
如果性能不是瓶颈,雅格尼:你不会需要它的。过早的优化是万恶之源。我不知道如何设置
l1
。但是我怀疑如果你能为所有的I,j
得到l2
,那么对A[l1,l2]
的添加可以用一个numpy表达式完成。如果l1、l2
值具有重复项,则加法将更加复杂,但并非不可能。所以我猜,argmin
表达式是症结所在。你可以先把重点放在消除j
循环上。谢谢你的回答。实际上,我试图寻找在IDL中实现的Value_Locate(s,dE)的Python版本,其中dE可以是数字或多维数组。但由于某种原因,Python中缺少这样的函数,或者它可能存在于Numpy之外的另一个包中?如果Numpy可以通过添加一个处理数组的功能来改进argmin,那就太好了。@Paitel,可能是因为它根据数组维度以及矩阵/数组的排序位置而有很大的不同。如果对数据进行了排序,您可以使用searchsorted()
,大大降低时间复杂度。
for i in range(N):
for j in range(M):
l2 = numpy.argmin(numpy.abs(s - dE[i,j]))
A[l1,l2] = A[l1,l2] + (n[j]+1)*I[i,j]