以下のコードは、私が現在実施していたアルゴリズムで発生した問題を再現:反復的な要素ごとの配列の乗算がnumpyで遅くなるのはなぜですか?
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ビット版を、
- Numpy 1.7.1 with MKL;
- のWindows 8
私はLinuxでのpython-2.7.4でこの動作を参照してくださいとは思いません。 –
これはおそらく非正規化数のためです:http://stackoverflow.com/a/9314926/226621 –
私のテストでは、スローダウンが始まるとすぐに中断し、 'numpy.amin(numpy.abs(numpy.abs y [y!= 0])) 'と' 4.9406564584124654e-324'を得たので、非正規数があなたの答えだと思います。私はPythonの中でdenormalsを0にする方法を知らないのですが、Cの拡張を作成する以外には... –