Каковы последствия запуска python с флагом оптимизации? - PullRequest
29 голосов
/ 14 мая 2010

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

Ответы [ 4 ]

27 голосов
/ 14 мая 2010

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

Кроме -OO, кроме того, строки документов также исключаются.

24 голосов
/ 14 мая 2010

С документы :

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

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

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

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

7 голосов
/ 14 мая 2010

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

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

  • заставляет интерпретатор загружать файлы .pyo, а не .pyc (в файлах .zip просто делает .pyo более предпочтительным, чем .pyc)
  • заставляет __debug__ иметь значение 0
  • игнорирует утверждения assert в исходном коде
  • статически __debug__ рассматривает как 0
  • заставляет генератор байтового кода сохранять файлы .pyo, а не .pyc
5 голосов
/ 10 июня 2010

Как ответили в режиме оптимизации Python :

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

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

и когда вызывается как python -OO

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...