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

标签 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位版本;
  • 带有 MKL 的 Numpy 1.7.1;
  • Windows 8。

最佳答案

正如@Alok 所指出的,这似乎是由 denormal numbers 引起的影响性能。我在我的 OSX 系统上运行它并确认了这个问题。我不知道在 numpy 中将非正规数刷新为零的方法。我会尝试通过避免非常小的数字来解决算法中的这个问题:你真的需要除以 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

关于python - 为什么迭代元素数组乘法在 numpy 中变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553660/

相关文章:

Android Emulator 太慢了,我无法使用它

python - 使用棉花糖中的数据更新行 (SQLAlchemy)

python-3.x - 修复了从PIL图像到OpenCV Mat的低效图像转换

python - 将邻接矩阵转换为抽象单纯复形

python - 执行大点/张量点积同时仅保留对角线条目的最有效方法

windows - MS-Windows 调度程序控制(或其他)——在较慢的 CPU 上测试应用程序性能?

php - 从 PHP 到 Python 住宿

python - 使 setuptools 与 one_file.py 一起工作的最小目录结构是什么?

python - 制作一个可以被多个按钮使用的功能

python - Python 中的多处理 : Numpy + Vector Summation -> Huge Slowdown