Все начинается с Рэймонда Хеттингера об альтернативном операторе инкремента 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
, остальные инструкции практически идентичны.