Це велика плутанина для людей, які почали працювати над пітоном, і відповіді тут трохи важко зрозуміти, тому я полегшу.
Коли ми доручаємо Python запустити наш скрипт, є кілька кроків, які виконує Python, перш ніж наш код насправді почне стискати:
- Він компілюється в байт-код.
- Потім він перенаправляється на віртуальну машину.
Коли ми виконуємо вихідний код, Python компілює його в байт-код. Компіляція - це етап перекладу, а байт-код - це низькорівневе платформене представлення вихідного коду. Зауважте, що байт-код Python не є двійковим машинним кодом (наприклад, інструкція для мікросхеми Intel).
Власне, Python переводить кожне твердження вихідного коду в інструкції байт-коду, розкладаючи їх на окремі етапи. Переклад байтового коду виконується для прискорення виконання. Байт-код можна запустити набагато швидше, ніж оригінальні заяви вихідного коду. Він має розширення.pyc, і він буде записаний, якщо він зможе записати на нашу машину.
Отже, наступного разу, коли ми запустимо ту саму програму, Python завантажить файл .pyc і пропустить етап компіляції, якщо він не був змінений. Python автоматично перевіряє часові позначки вихідних та байтових файлів коду, щоб знати, коли він повинен перекомпілюватись. Якщо ми збережемо вихідний код, байтовий код автоматично створюється знову при наступному запуску програми.
Якщо Python не може записати файли коду байтів на нашу машину, наша програма все ще працює. Код байту генерується в пам'яті і просто викидається при виході з програми. Але оскільки файли .pyc прискорюють час запуску, ми можемо захотіти переконатися, що вони написані для великих програм.
Давайте підведемо підсумки, що відбувається за лаштунками. Коли Python виконує програму, Python зчитує .py в пам'ять і аналізує її, щоб отримати байт-код, а потім продовжує виконання. Для кожного модуля, який імпортується програмою, Python спочатку перевіряє, чи є попередньо скомпільована версія байт-коду у форматі .pyo чи .pyc, що має часову позначку, що відповідає її файлу .py. Python використовує версію байт-коду, якщо така є. В іншому випадку він аналізує .py-файл модуля, зберігає його у .pyc-файл та використовує щойно створений байт-код.
Байтові файли коду також є одним із способів доставки кодів Python. Python все одно запустить програму, якщо всі файли є файли.pyc, навіть якщо оригінальних вихідних файлів .py там немає.
Віртуальна машина Python (PVM)
Після того, як наша програма складена в байт-код, вона відправляється на виконання до віртуальної машини Python (PVM). PVM не є окремою програмою. Його не потрібно встановлювати самостійно. Насправді, PVM - це просто великий цикл, який повторюється за допомогою нашої інструкції по байтовому коду по черзі для виконання своїх операцій. PVM - це двигун виконання Python. Він завжди присутній як частина системи Python. Це компонент, який справді запускає наші сценарії. Технічно це лише останній крок того, що називається інтерпретатором Python.