np.sum和np.add.reduce有什么区别?

ev-*_*-br 25 python numpy

np.sum和之间有什么区别np.add.reduce
虽然文档很明确:

例如,add.reduce()等效于sum().

两者的性能似乎完全不同:相对较小的阵列大小add.reduce大约快两倍.

$ 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
Run Code Online (Sandbox Code Playgroud)

对于更大的阵列尺寸,差异似乎消失了:

$ 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
Run Code Online (Sandbox Code Playgroud)

War*_*ser 24

简短的回答:当参数是一个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)
Run Code Online (Sandbox Code Playgroud)

umadd是定义ufunc 的模块.


Pau*_*zer 9

如果你盲目地从一个重构到另一个,实际上有一个区别可能会咬你:

>>> import numpy as np
>>> a = np.arange(4).reshape(2, 2)
>>> 
>>> np.sum(a)
6
>>> np.add.reduce(a)
array([2, 4])
>>> 
Run Code Online (Sandbox Code Playgroud)

axis默认值是不同的!