numpy — почему Y * = 2 быстрее, чем Y =Y?

#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) это та же скорость.