为什么迭代元素数组乘法在numpy中减慢?

时间:2013-05-14 22:09:17

标签: python numpy slowdown

下面的代码再现了我在目前正在实施的算法中遇到的问题:

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

问题是经过一些迭代后,事情开始逐渐变慢,直到一次迭代所花费的时间比最初多一倍。

放缓的情节 enter image description here

Python进程的CPU使用率一直稳定在17-18%左右。

我正在使用:

  • Python 2.7.4 32位版本;
  • Numpy 1.7.1 with MKL;
  • Windows 8。

1 个答案:

答案 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')

这将使您的每个步骤更加昂贵,但每个步骤大致需要相同的时间。

在我的系统中查看以下比较: enter image description here