- Часть I. Вводное руководство
- Глава 2. Использование интерпретатора
- 2.2. Интерпретатор и его среда
- 6.3. "Компилированные" файлы
6.3. "Компилированные" файлы
Для ускорения запуска программ, использующих большое количество модулей, если уже существует файл с именем ‘spam.pyc’ в том же каталоге, где найден ‘spam.py’, считается, что он содержит "байт-компилированный"” модуль spam. Если такого файла нет, то он создается, и время последнего изменения 'spam.py' записывается в созданном 'spam.pyc' (при последующем использовании, '.pyc' - файл игнорируется, если исходный '.py' - файл был изменён).
Обычно Вам не надо ничего делать для создания 'spam.pyc'. Как только 'spam.py' успешно откомпилирован, интерпретатор пытается записать компилированную версию в 'spam.pyc'. Если интерпретатору по каким-либо причинам это не удается (например, недостаточно пользовательских полномочий), ошибки не возникает. Если же файл записан не полностью, далее он распознается как неработоспособный и игнорируется. Содержимое байт-компилированных файлов является платформно-независимым (но может быть разным для разных версий интерпретатора), так что каталог с модулями может совместно использоваться машинами с разными архитектурами.
Несколько тонкостей для опытных пользователей:
1) Если интерпретатор вызывается с опцией -O или переменная окружения PYTHONOPTIMIZE имеет непустое значение, интерпретатор генерирует оптимизированный байт-код и сохраняет его в '.pyo' - файлах. В настоящий момент оптимизация даёт не слишком много: при этом удаляются инструкции assert, игнорируются инструкции 'if __debug__: ...', не сохраняется информация о нумерации строк в исходных '.py' - файлах. В этом случае оптимизируются все используемые модули, '.pyc' - файлы игнорируются.
2) Опция -OO приводит к тому, что интерпретатор выполняет оптимизацию которая, в некоторых (редких) случаях, может привести к сбоям в работе программ. В настоящий момент, помимо действий, выполняемых с опцией -O, удаляются строки документации, давая более компактные '.pyo' - файлы. Так как некоторые программы могут рассчитывать на наличие строк документации, используйте эту опцию с осторожностью.
3) Для программы, запускаемой из командной строки, байт-код никогда не записывается в '.pyc' - или '.pyo' - файл. Поэтому, если Вы хотите уменьшить время, требующееся для загрузки, поместите большую часть кода в модуль, оставив в программе лишь загрузочную часть, которая импортирует этот модуль.
4) Возможно использование модуля (или запуск программы) при наличии '.pyc' - файла (или '.pyo' - файла, если используется одна из опций -O или -OO), даже если отсутствует '.py' - файл. Таким образом, Вы можете распространять библиотеки и программы в виде, из которого относительно сложно извлечь информацию об используемых алгоритмах.
5) Модуль compileall позволяет создать '.pyc' - (или '.pyo') файлы для всех модулей в каталоге. Это может быть особенно полезно, если вы хотите ограничить доступ к каталогу, в котором находится библиотека. Заметим, что интерпретатор не будет использовать '.pyc' - файлы, если он запущен с включенной оптимизацией, и '.pyo' - файлы, если оптимизация выключена (если же отсутствует '.py' - файл, модуль окажется недоступным).