Я не могу найти хорошее простое объяснение того, что делает python по-другому при работе с флагом -O или optimize.
Каковы последствия запуска python с флагом оптимизации?
Ответ 1
Операторы assert
полностью исключаются, как и блоки операторов формы if __debug__: ...
(поэтому вы можете поместить свой код отладки в такие блоки операторов и просто запустить с помощью -O
, чтобы избежать этого кода отладки).
С -OO
, кроме того, также устраняются docstrings.
Ответ 2
От документы:
Когда вызывается интерпретатор Python с флагом -O оптимизированный код сгенерированы и сохранены в .pyo файлах. Оптимизатор в настоящее время не помогает много; он удаляет только утверждение заявления. Когда используется -O, все байт-код оптимизирован;.pyc файлы игнорируются и .py файлы скомпилированы для оптимизированный байт-код.
Передача двух-O-флагов на Python интерпретатор (-OO) приведет к компилятор байт-кода для выполнения оптимизация, которая может быть в некоторых редких случаи приводят к неисправности программы. В настоящее время только
__doc__
строки удаляются из байт-кода, что приводит к более компактным файлам .pyo. Поскольку некоторые программы могут они доступны, вы должны использовать этот вариант, если вы знаете, что вы делает.Программа не работает быстрее, если он считывается из файла .pyc или .pyo чем когда он считывается из .py файла; единственное, что быстрее .pyc или .pyo - это скорость с которые они загружают.
Иными словами, почти ничего.
Ответ 3
Это несколько зависит от Python версия. Чтобы узнать, что именно выполняет поиск исходного кода для Py_OptimizeFlag. В 2.5,
- заставляет интерпретатор загружать файлы .pyo, а не файлы .pyc(в .zip файлы, просто делает .pyo предпочтительнее .pyc)
- вызывает
__debug__
значение 0- игнорирует утверждения в исходном коде
- рассматривает
__debug__
статически как 0- заставляет генератор байтового кода сохранять файлы .pyo, а не .pyc
Ответ 4
Как указано в режиме оптимизации python:
python -O выполняет следующие действия:
- полностью игнорирует утверждения
- устанавливает специальное встроенное имя
__debug__
в значение False (которое по умолчанию имеет значение True)
и при вызове python -OO
- удаляет docstrings из кода
Я не знаю, почему все забывают упомянуть проблему __debug__
; возможно, это потому, что я единственный, кто ее использует:) Конструкция if __debug__
вообще не создает байт-код при работе под -O
, и я нахожу это очень полезным.