Почему INPLACE_ADD быстрее, чем INPLACE_SUBTRACT в python? - PullRequest
2 голосов
/ 23 мая 2019

Все начинается с Рэймонда Хеттингера об альтернативном операторе инкремента aka Оператор космического вторжения

Я хотел проверить производительность операторов += и -=-, используя модуль timeit

Python 3

python3 -m timeit "for i in range(1000000): i+=1"                   
python3 -m timeit "for i in range(1000000): i-=-1" 

выход:

10 loops, best of 5: 35.9 msec per loop
10 loops, best of 5: 36.6 msec per loop

Python 2

python -m timeit "for i in range(1000000): i+=1"
python -m timeit "for i in range(1000000): i-=-1"

вывод:

10 loops, best of 5: 35.7 msec per loop               
10 loops, best of 5: 36.7 msec per loop

Обратите внимание, что как в Python 2, так и в Python 3 += быстрее, чем -=- почти на 1msec, хотя результаты обеих операций просто увеличивают переменную i на 1.

См. Ниже инструкции по байт-коду, сгенерированные для этих двух операторов с использованием модуля dis .

>>> import dis
>>> def io(i): i+=1
>>> def aio(i): i-=-1
>>> dis.dis(io)
  1           0 LOAD_FAST                0 (i)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_FAST               0 (i)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> dis.dis(aio)
  1           0 LOAD_FAST                0 (i)
              2 LOAD_CONST               1 (-1)
              4 INPLACE_SUBTRACT
              6 STORE_FAST               0 (i)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> 

Единственным отличием являются инструкции INPLACE_ADD и INPLACE_SUBTRACT, остальные инструкции практически идентичны.

...