Подтвердить что ты не робот

Каковы последствия запуска python с флагом оптимизации?

Я не могу найти хорошее простое объяснение того, что делает python по-другому при работе с флагом -O или optimize.

4b9b3361

Ответ 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

От Что делает флаг -O?

Это несколько зависит от 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, и я нахожу это очень полезным.