Опишите процесс компиляции в python.
В CPython исходный файл .py сначала автоматически компилируется в байт‑код, а уже затем исполняется виртуальной машиной Python. Байт‑код модулей, которые импортируются, обычно кэшируется в виде файлов .pyc в каталоге __pycache__ для ускорения последующих запусков. Основной скрипт, который вы запускаете напрямую (например, python script.py), как правило, исполняется из памяти и его байт‑код может не сохраняться в кэше.
Хотя Python обычно называют интерпретируемым языком, в реальности в CPython есть явный этап компиляции: исходный текст .py переводится в байт‑код, который затем исполняется виртуальной машиной Python (PVM).
Упрощённо процесс выглядит так:
.py, выполняет лексический и синтаксический разбор и строит абстрактное синтаксическое дерево (AST); на этом этапе ловятся синтаксические ошибки.import, скомпилированный байт‑код сохраняется в каталоге __pycache__ в файлы вида module.cpython-311.pyc. При следующем импорте Python проверит метаданные (штамп времени или хэш) и, если исходник не изменился, просто загрузит готовый байт‑код вместо повторной компиляции.Важно различать поведение для импортируемых модулей и для главного скрипта:
1. Импортируемые модули. Когда вы пишете import mymodule, CPython компилирует mymodule.py в байт‑код и, как правило, сохраняет его в __pycache__/mymodule....pyc. При следующем импорте модуль загружается из .pyc, если он актуален, что заметно ускоряет старт больших приложений.
2. Главный скрипт (точка входа). Файл, который вы запускаете как python script.py, также компилируется в байт‑код, но он обычно исполняется сразу и его байт‑код не обязан быть записан в __pycache__. Поэтому вы можете не увидеть script.pyc для такого файла, хотя байт‑код, конечно, существует в памяти на время выполнения программы.
Отсюда и распространённое наблюдение: «в кэш попадают в основном модули из import, а не сам вызываемый файл». Тем не менее вы можете явно скомпилировать любой файл в .pyc сами.
Python позволяет явно запускать компиляцию без исполнения кода. Это удобно для предварительного прогрева кэша либо для проверки, что файлы хотя бы синтаксически корректны:
Итого: в CPython всегда есть скрытый этап компиляции в байт‑код; кэширование в __pycache__ по умолчанию применяется к импортируемым модулям, а главный исполняемый скрипт может не оставлять за собой .pyc, хотя он так же проходит через компилятор и виртуальную машину.
Отметьте свой прогресс