Почему основные исполняемые скрипты Python не компилируются в pyc-файлы, такие как модули? - PullRequest
30 голосов
/ 07 октября 2010

Я понимаю, что при импорте модуля этот файл компилируется в файл .pyc, чтобы сделать его быстрее?Почему основной файл также не скомпилирован в .pyc?Это замедляет вещи?Было бы лучше, чтобы основной файл был как можно меньшим, или это не имеет значения?

Ответы [ 2 ]

31 голосов
/ 07 октября 2010

Когда модуль загружен, py-файл "скомпилирован байтами" в pyc-файлы. Отметка времени записывается в файлах pyc. Это сделано не для того, чтобы он работал быстрее, а для быстрой загрузки. Следовательно, имеет смысл «байтово компилировать» модули при их загрузке.

[Редактировать: Включить примечания, ссылки]

От PEP 3147 до "Байт-код" сборник ":

CPython компилирует свой исходный код в «байт-код» и по соображениям производительности он кэширует этот байт-код в файловой системе всякий раз, когда в исходном файле есть изменения. Это делает загрузку модулей Python намного быстрее, потому что фаза компиляции можно обойти Когда ваш исходный файл foo.py, CPython кэширует байт код в файле foo.pyc рядом с исходным кодом.

Как скомпилированы файлы с байтовым кодом отслеживается в отношении версии Python и "py" файл меняется:

Он также вставляет магическое число в файлы скомпилированного байтового кода ".pyc". Это меняется всякий раз, когда Python изменяет формат байтового кода, обычно в основных выпусках.
Это гарантирует, что файлы pyc, созданные для предыдущих версий виртуальной машины, не вызовут проблем. Отметка времени используется, чтобы убедиться, что файл pyc соответствует файлу py, который был используется для его создания. Когда магическое число или временная метка не совпадают, файл py перекомпилируется, и записывается новый файл pyc.

Файлы "pyc" не совместимы между основными выпусками Python. Когда Python находит pyc файл с несовпадающим магическим числом, он возвращается к более медленному процессу перекомпиляция источника.

По этой причине, если вы просто распространите файлы ".pyc", скомпилированные для той же платформы, больше не будет работать, если версия Python изменится.

В двух словах

Если есть байтовый скомпилированный файл ".pyc", и его временная метка указывает, что он недавно, то он будет загружен, другой мудрый питон откатится на более медленный подход загрузки файлов ".py". На производительность выполнения файла «.py» это не влияет, но загрузка файлов «.pyc» происходит быстрее, чем файлов «.py».

Рассмотрите возможность выполнения a.py, который импортирует b.py

Typical total performance = loading time (A.py) + execution time (A.py) + 
                            loading time (B.py) + execution time (B.py) 

Since loading time (B.pyc)  <  loading time (B.py)

You should see a better performance by using the byte compiled "pyc" files. 

Тем не менее, если у вас большой файл сценария X.py, его модульная модификация и перемещение содержимого в другие модули приводит к снижению времени загрузки скомпилированного файла с байт-кодом.

Другим выводом является то, что модули, как правило, более стабильны, чем скрипт или основной файл. Следовательно, это не байт, скомпилированный вообще.

Ссылки

0 голосов
/ 07 октября 2010

Компиляция основного скрипта будет раздражать, например, в /usr/bin.Файл .pyc создается в том же каталоге, что загрязняет общедоступное местоположение.

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