1

Numpy は高速であるはずです。ただし、Numpy ufunc と標準の Python 関数を比較すると、後者の方がはるかに高速であることがわかります。

例えば、

aa = np.arange(1000000, dtype = float)
%timeit np.mean(aa) # 1000 loops, best of 3: 1.15 ms per loop
%timeit aa.mean # 10000000 loops, best of 3: 69.5 ns per loop

max、power などの他の Numpy 関数でも同様の結果が得られました。Numpy にはオーバーヘッドがあり、小さな配列では遅くなるが、大きな配列では速くなるという印象を受けました。上記のコードでは、aa は小さくありません: 100 万の要素があります。何か不足していますか?

もちろん、Numpy は高速ですが、関数だけが遅いようです。

bb = range(1000000)
%timeit mean(bb) # 1 loops, best of 3: 551 ms per loop
%timeit mean(list(bb)) # 10 loops, best of 3: 136 ms per loop
4

2 に答える 2

6

他の人は、比較が実際の比較ではないことをすでに指摘しています(関数を呼び出していません+両方がnumpyです)。しかし、 「numpy 関数は遅いですか?」
という質問に答えるには、: 一般的に言えば、いいえ、numpy 関数は遅くはありません (またはプレーンな python 関数より遅くはありません)。もちろん、作成するいくつかの補足事項があります。

必要な比較を行うには:

In [1]: import numpy as np
In [2]: aa = np.arange(1000000)
In [3]: bb = range(1000000)

(注意、meanPython 標準ライブラリには平均関数はありません: Python での算術平均 (平均) の計算):

In [4]: %timeit np.mean(aa)
100 loops, best of 3: 2.07 ms per loop

In [5]: %timeit float(sum(bb))/len(bb)
10 loops, best of 3: 69.5 ms per loop

maxnumpy とプレーンな python の場合 :

In [6]: %timeit np.max(aa)
1000 loops, best of 3: 1.52 ms per loop

In [7]: %timeit max(bb)
10 loops, best of 3: 31.2 ms per loop

最後の注意として、上記の比較では、numpy 関数には numpy 配列 ( ) を使用し、プレーンな python 関数にはaaリスト ( ) を使用しました。bbnumpy 関数でリストを使用すると、この場合も遅くなります。

In [10]: %timeit np.max(bb)
10 loops, best of 3: 115 ms per loop

リストは最初に配列に変換されるためです (ほとんどの時間を消費します)。そのため、アプリケーションで numpy に依存する場合は、numpy 配列を使用してデータを格納することが重要です (または、リストがある場合は、配列に変換して、この変換を 1 回だけ行う必要があります)。

于 2013-08-05T11:38:10.763 に答える
5

あなたは電話していませんaa.mean。関数呼び出しの括弧を最後に付けて実際に呼び出すと、速度の違いはほとんどなくなります。(np.mean(aa)aa.mean()はどちらも NumPy です。どちらも Python ビルトインを使用して計算を行いません。)

于 2013-08-05T01:57:04.163 に答える