Нет, это не так .
Компиляция в байтовый код CPython проходит только через небольшой оптимизатор-глазок, который предназначен для выполнения только основных оптимизаций (см. Test_peepholer.py в наборе тестов для получения дополнительной информации об этих оптимизациях).
Чтобы dis
увидеть, что на самом деле произойдет, используйте * для просмотра созданных инструкций. Для первой функции, содержащей присвоение:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
А для второй функции:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
В первой используются еще две (быстрые) инструкции: STORE_FAST
и LOAD_FAST
. Они позволяют быстро сохранить и получить значение в fastlocals
массиве текущего кадра выполнения. Затем в обоих случаях RETURN_VALUE
выполняется а. Итак, второй работает немного быстрее из-за меньшего количества команд, необходимых для выполнения.
В общем, имейте в виду, что компилятор CPython консервативен в оптимизации, которую он выполняет. Он не и не пытается быть таким же умным, как другие компиляторы (которые, как правило, также имеют гораздо больше информации для работы). Основная цель дизайна, помимо очевидной правильности, состоит в том, чтобы а) сохранить простоту и б) как можно быстрее скомпилировать их, чтобы вы даже не заметили, что существует фаза компиляции.
В конце концов, не стоит беспокоиться о таких мелких проблемах, как эта. Выигрыш в скорости крошечный, постоянный и превосходит накладные расходы, связанные с интерпретацией Python.
* dis
- это небольшой модуль Python, который дизассемблирует ваш код, вы можете использовать его, чтобы увидеть байт-код Python, который будет выполнять виртуальная машина.
Примечание. Как также указано в комментарии @Jorn Vernee, это относится к реализации Python в CPython. Другие реализации могут делать более агрессивные оптимизации, если они того пожелают, а CPython - нет.
dis.dis(..)
оба, вы увидите, что есть разница , так что да. Но в большинстве реальных приложений накладные расходы по сравнению с задержкой обработки в функции не так велики.