Ott*_*kar 14 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
Run Code Online (Sandbox Code Playgroud)
问题是经过一些迭代后,事情开始逐渐变慢,直到一次迭代所花费的时间比最初多一倍.
放缓的情节

Python进程的CPU使用率在整个时间内稳定在17-18%左右.
我正在使用:
正如@Alok 指出的,这似乎是由影响性能的非正规数引起的。我在我的 OSX 系统上运行它并确认了该问题。我不知道有什么方法可以在 numpy 中将非正规值刷新为零。我会尝试通过避免非常小的数字来解决算法中的这个问题:你真的需要进行除法y直到它达到1.e-324水平吗?
如果您避免出现低数字,例如通过在循环中添加以下行:
y += 1e-100
Run Code Online (Sandbox Code Playgroud)
那么每次迭代的时间都是固定的(尽管由于额外的操作而速度较慢)。另一种解决方法是使用更高精度的算术,例如
x = rand.normal(size=(300,50000)).astype('longdouble')
y = rand.normal(size=(300,50000)).astype('longdouble')
Run Code Online (Sandbox Code Playgroud)
这将使您的每个步骤更加昂贵,但每个步骤花费的时间大致相同。
在我的系统中查看以下比较:

| 归档时间: |
|
| 查看次数: |
753 次 |
| 最近记录: |