Почему np.power () медленнее, чем np.exp (np.log ())? - PullRequest
2 голосов
/ 17 января 2020

Я заметил кое-что странное: для нетривиальных показателей (то есть, не для 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...