下面的代码再现了我在目前正在实施的算法中遇到的问题:
import numpy.random as rand
import time
x = rand.normal(size=(300,50000))
y = rand.normal(size=(300,50000))
for i in range(1000):
t0 = time.time()
y *= x
print "%.4f" % (time.time()-t0)
y /= y.max() #to prevent overflows
问题是经过一些迭代后,事情开始逐渐变慢,直到一次迭代所花费的时间比最初多一倍。
放缓的情节
Python进程的CPU使用率一直稳定在17-18%左右。
我正在使用:
答案 0 :(得分:3)
正如@Alok所指出的,这似乎是由影响性能的denormal numbers引起的。我在我的OSX系统上运行它并确认了问题。我不知道在numpy中将denormals刷新为零的方法。我会尝试通过避免非常小的数字来解决算法中的这个问题:你真的需要将y
除以它到1.e-324
级别吗?
如果你避免低数字,例如在循环中添加以下行:
y += 1e-100
然后每次迭代都会有一个恒定的时间(虽然因为额外的操作而变慢)。另一种解决方法是使用更高精度的算术,例如
x = rand.normal(size=(300,50000)).astype('longdouble')
y = rand.normal(size=(300,50000)).astype('longdouble')
这将使您的每个步骤更加昂贵,但每个步骤大致需要相同的时间。
在我的系统中查看以下比较: