2016-06-02 6 views
1

反復アルゴリズムでは、大量の配列を何回も使用するのが一般的です。私は既存の大規模な配列に値を書きたいと思っていますが、新しい配列を作成することがさらに速いことがわかりました。既存のnumpy配列を再利用するか、新しい配列を作成しますか?

>>>import numpy as np 
>>>a=np.arange(10000) 
>>>b=a.copy() 
>>>%timeit b=a+a # Every time create a new array 
100000 loops, best of 3: 9.59 µs per loop 
>>>%timeit b[:]=a+a # Use existing array 
100000 loops, best of 3: 13.3 µs per loop 
>>>%timeit np.copyto(b,a+a) # Another way to use existing array 
100000 loops, best of 3: 13.4 µs per loop 
  • 既存のアレイを再利用する任意のより高速な方法はありますか? (例えば、上記のb
  • このような方法がない場合、なぜ新しいアレイを作成する方が速いのですか?
  • 毎回新しいアレイを再作成するという欠点はありますか?私のデータが大きいので、私はそれについて躊躇し、すべての反復でそれを異なる値で割り当てる必要があります。
+0

私は 'b [:] = a + a'を実行すると+ aを最初に計算し、それを配列に入れ、その配列をbのメモリに割り当てます。 – Peter

答えて

2
  • np.copyto(b,a);b+=a最速の方法より高速ですが、ありません。
  • np.add(a,a,b)が最良の選択肢です。100000回のループ、最高3回ループあたり8.66μsです。

多分b[:]=a+aはいくつかの一時計算スペースを生成するでしょうか?私はkonwしない。しかし、 "+ =、 - =、* =、add"を使用すると、これらのufunは間違っていません。

関連する問題