31

np.sumとはどう違いnp.add.reduceますか?ドキュメントは非常に明示的ですが

たとえば、add.reduce() は sum() と同等です。

2 つのパフォーマンスはかなり異なるようです。比較的小さい配列サイズadd.reduceでは、約 2 倍高速です。

$ python -mtimeit -s"import numpy as np; a = np.random.rand(100); summ=np.sum" "summ(a)"
100000 loops, best of 3: 2.11 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(100); summ=np.add.reduce" "summ(a)"
1000000 loops, best of 3: 0.81 usec per loop

$ python -mtimeit -s"import numpy as np; a = np.random.rand(1000); summ=np.sum" "summ(a)"
100000 loops, best of 3: 2.78 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(1000); summ=np.add.reduce" "summ(a)"
1000000 loops, best of 3: 1.5 usec per loop

より大きな配列サイズの場合、違いはなくなるようです:

$ python -mtimeit -s"import numpy as np; a = np.random.rand(10000); summ=np.sum" "summ(a)"
100000 loops, best of 3: 10.7 usec per loop
$ python -mtimeit -s"import numpy as np; a = np.random.rand(10000); summ=np.add.reduce" "summ(a)"
100000 loops, best of 3: 9.2 usec per loop
4

3 に答える 3

30

簡単な答え: 引数が numpy 配列の場合、np.sum最終的add.reduceには作業を行うために呼び出します。引数の処理とディスパッチのオーバーヘッドが遅いadd.reduce理由です。np.sum

より長い答え: np.sumで定義されていnumpy/core/fromnumeric.pyます。の定義ではnp.sum、作業が に渡されることがわかります_methods._sum。のその関数は、_methods.py単純に次のとおりです。

def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    return um.add.reduce(a, axis=axis, dtype=dtype,
                            out=out, keepdims=keepdims)

umaddufunc が定義されているモジュールです。

于 2013-05-07T14:13:01.637 に答える