Почему основные исполняемые сценарии Python не скомпилированы в файлы pyc, такие как модули?

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

Ответ 1

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

[Изменить: включение заметок, ссылок]

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

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

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

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

Файлы

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

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

В двух словах

Если есть байт, скомпилированный файл ".pyc", и он указывает, что он является последним, тогда он будет загружен, другой мудрый python будет отступать от более медленного подхода загрузки ".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. 

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

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

Ссылки

Ответ 2

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