В чем разница между np.sum и np.add.reduce?
В чем разница между 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
Для больших размеров массива разница, похоже, исчезает:
$ 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
Ответы
Ответ 1
Короткий ответ: когда аргумент представляет собой массив 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)
um
- это модуль, в котором определяется add
ufunc.
Ответ 2
На самом деле существует одна разница, которая может вас укусить, если вы должны слепо реорганизовать от одного к другому:
>>> import numpy as np
>>> a = np.arange(4).reshape(2, 2)
>>>
>>> np.sum(a)
6
>>> np.add.reduce(a)
array([2, 4])
>>>
Значения axis
по умолчанию различны!