Ответ 1
Под капотом оба выражения вызывают соответствующие функции C pow
или exp
и log
и запускает профилирование на тех, что есть на С++, без какого-либо numpy-кода, дает:
pow : 286 ms
exp(log) : 93 ms
Это согласуется с таймингом numpy. Похоже, что основное отличие состоит в том, что функция C pow
медленнее, чем exp(log)
.
Почему? Похоже, что часть резона состоит в том, что выражения не эквивалентны для всех входных данных. Например, с отрицательным a
и целым числом b
, power
работает, пока exp(log)
терпит неудачу:
>>> np.power(-2, 2)
4
>>> np.exp(2 * np.log(-2))
nan
Другим примером является 0 ** 0
:
>>> np.power(0, 0)
1
>>> np.exp(0 * np.log(0))
nan
Следовательно, трюк exp(log)
работает только на подмножестве входов, а power
работает на всех (действительных) входах.
В дополнение к этому power
гарантируется полная точность в соответствии с стандартом IEEE 754, а exp(log)
может пострадать от ошибок округления.