#python #numpy #optimization
#python #numpy #оптимизация
Вопрос:
Вопрос
Почему Y*=2
быстрее, чем Y =Y
?
elepased = timeit.timeit(
stmt="Y*=2; np.add(X, Y, out=X)",
setup=setup,
number=iterations
)
elepased / iterations * 1e6
81.25868347997312
elepased = timeit.timeit(
stmt="Y =Y; np.add(X, Y, out=X)",
setup=setup,
number=iterations
)
elepased / iterations * 1e6
92.05061321998073
import numpy as np
import timeit
setup = """
import numpy as np
X = np.ones(100000, dtype=np.int)
Y = np.ones(100000, dtype=np.int)
"""
iterations = 100000
Комментарии:
1. У меня есть 3 гипотезы: 1) NumPy может использовать более эффективный цикл для случая array-vs-scalar (возможно, меньше итераторов массива). 2) NumPy может быть проще подтвердить, что ему не нужно копировать входные данные для обработки перекрытия ввода / вывода в случае array-vs-scalar. 3) Проверка на наличие крючков настройки, например
__array_ufunc__
, может пройти быстрее в случае array-vs-scalar.2. В моих
timeit
тестахY =Y
скромно быстрее, чемY*=2
. Но я задаюсь вопросом, стоит ли экономия времениX Y Y
потери удобочитаемости.3. На моем компьютере (Mac Pro 2019) это та же скорость.