2010-05-13 4 views
24

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

+0

Возможный дубликат [оптимизированный для python режим] (http://stackoverflow.com/questions/2055557/python-optimized-mode) – tzot

ответ

19

assert заявление полностью устранены, так же как заявление блоки формы if __debug__: ... (так что вы можете поместить код отладки в таких заявлениях блоков и просто работать с -O, чтобы избежать этого кода отладки).

С -OO, кроме того, также устраняются докстры.

+7

Насколько это верно в Python 3? –

19

От the docs:

Когда интерпретатор Python вызывается с флагом -O, оптимизированный код сгенерированы и сохранены в файлах .pyo. Оптимизатор в настоящее время не помогает much; он удаляет только утверждения . Когда используется -O, оптимизируется весь байт-код; .pyc файлы проигнорированы и .py файлы скомпилированы в оптимизированный байт-код.

Передача двух -О флагов интерпретатора Python (-со) заставит байткод компилятор для выполнения оптимизации, которые могли бы в некоторых редких случаях привести к неисправной программ. В настоящее время только __doc__ строки удаляются из байт-кода, , что приводит к более компактным файлам .pyo. Поскольку некоторые программы могут полагаться на то, что они доступны , вы можете использовать этот параметр только , если знаете, что вы делаете .

Программа не работает быстрее, когда считывается из .pyc или .pyo-файла , чем когда он считывается из .py-файла; Единственное, что быстрее примерно .pyc или .pyo файлы - это скорость с , которую они загружают.

Так что, другими словами, почти ничего.

6

От What does the -O flag do?

Это несколько зависит от версии Python . Чтобы точно узнать, что это такое , поиск исходного кода для Py_OptimizeFlag. В 2.5, это

  • вызывает интерпретатор, чтобы загрузить файлы .pyo, а не .pyc файлы (в ZIP-файлы, просто делает .pyo предпочтительнее .pyc)
  • причин __debug__ иметь значение 0
  • игнорируемые утверждают операторы в исходном коде
  • лечит __debug__ статический как 0
  • вызывает байты генераторов коды для сохранения .pyo файлов, нет.Pyc
4

Как ответил python optimization mode:

питон -О выполняет следующее в настоящее время:

  • полностью игнорирует утверждает
  • устанавливает специальное встроенное имя __debug__ Лжи (который по умолчанию является истинным)

и когда называется питоном -со

  • удаляет строку документацию из кода

Я не знаю, почему все забывают упомянуть __debug__ вопрос; возможно, это потому, что я единственный, кто его использует :) Конструкция if __debug__ вообще не создает байт-код при работе под -O, и я нахожу это очень полезным.

+0

Обратите внимание, что этот ответ является точной копией моего ответа в вопросе [этого] (http://stackoverflow.com/questions/2055557/python-optimized-mode) с 13 января 2010 года; в своем ответе на этот вопрос Алекс Мартелли не упомянул конструкцию 'if __debug__', и поэтому мой ответ здесь кажется неуместным (мой« почему все забывают упомянуть »). – tzot

Смежные вопросы