Что делает флаг оптимизации при запуске Python программы
Что проверяют
Знаете ли вы, что -O это не оптимизатор, а выключатель отладочного кода, и понимаете ли последствия для assert. Вопрос выявляет опасную привычку проверять входные данные утверждениями.
Как отвечать
Запуск python -O script.py делает ровно две вещи: __debug__ становится ложным, и компилятор выбрасывает все инструкции assert вместе с блоками if __debug__:. Никаких преобразований кода вроде разворота циклов или инлайна не происходит.
-OO добавляет к этому удаление строк документации из байт-кода, что немного уменьшает размер файлов и расход памяти.
Полезно упомянуть детали, которые отличают знающего:
- оптимизированный байт-код кэшируется отдельно: файл в
__pycache__получает пометкуopt-1илиopt-2, поэтому обычная и оптимизированная сборки не затирают друг друга; - то же включается переменной окружения
PYTHONOPTIMIZE, а текущее значение видно вsys.flags.optimize; - выигрыш в скорости есть только там, где утверждения были дорогими, например проверяли инварианты в цикле по большому массиву. В обычном коде разница теряется в шуме.
Честный вывод такой: флаг стоит воспринимать как переключатель режима, а не как способ ускорить программу.
Где спотыкаются
Главная ошибка: проверяют assert входные данные, права доступа или ответ внешнего сервиса. Под -O такая проверка исчезает целиком, и код, который якобы валидировал, начинает молча пропускать что угодно. Для проверок нужен обычный if с явным исключением.
Второе: включают -OO и ловят падения в местах, где читается __doc__: doctest, разбор аргументов по строкам документации, справка в рантайме.
Третье: называют флаг оптимизацией и предлагают включать его в продакшене ради скорости. Реальное ускорение приходит от профилирования и алгоритмов, а лишний режим сборки создаёт расхождение между тем, что проверяли тестами, и тем, что запущено.