Я заметил кое-что странное: для нетривиальных показателей (то есть, не для 1, 2 и 0,5) функция power
кажется медленнее, чем вычисление того же с помощью логарифмов.
Рассмотрим следующий временной код:
import timeit
import numpy as np
two_thirds = (2.0 / 3.0)
def simple(x):
return x**two_thirds
def numpy_power(x):
return np.power(x, two_thirds)
def numpy_exp_log(x):
return np.exp(np.log(x) * two_thirds)
arr = np.random.rand(100)
min(timeit.Timer("simple(arr)", setup="from __main__ import arr, simple, two_thirds").repeat(10, 10000))
min(timeit.Timer("numpy_power(arr)", setup="from __main__ import arr, numpy_power, two_thirds").repeat(10, 10000))
min(timeit.Timer("numpy_exp_log(arr)", setup="from __main__ import arr, numpy_exp_log, two_thirds").repeat(10, 10000))
В соответствии с этими временами моя функция numpy_exp_log
занимает только около 65% времени других двух функций. Они возвращают одни и те же значения (по модулю ошибки округления с плавающей запятой, которые не имеют для меня большого значения). Это кажется мне действительно странным.
Возможно ли, что моя функция работает только быстрее, чем numpy power
на *1011* моем оборудовании, и другое оборудование может не отображать такую разницу ? Какая часть вычислений отправляется в соответствии с аппаратными инструкциями c? Могу ли я ожидать, что эта разница возникнет практически на любом компьютере с той же версией Python / Numpy? (Python 3.6.5, Numpy 1.16.1)