15

下面的代码重现了我在当前实现的算法中遇到的问题:

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% 左右。

我在用着:

  • Python 2.7.4 32位版本;
  • 带有 MKL 的 Numpy 1.7.1;
  • 视窗 8。
4

1 回答 1

4

正如@Alok 指出的那样,这似乎是由影响性能的异常数字引起的。我在我的 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')

这将使您的每一步都更加昂贵,但每一步所花费的时间大致相同。

在我的系统中查看以下比较: 在此处输入图像描述

于 2013-05-15T10:11:52.367 回答