Интерпретаторы CPython, Jython и их байткод

  • CPython — написан на С, что позволяет легкую интеграция модулей на Си в Python.

  • Jython — написан на Java, не компилирует Python в байт-код JVM, но позволяет интеграцию JVM модулей в Python.

Типичный путь Python кода

https://www.plantuml.com/plantuml/svg/FP7BIiD068NtUOgVh5feVG0NKknE40J1LJSn6IyG9vAaQ12XQK5TA5agkl0L8XXQ4zkymZzlv9aPqyKmcSlvpfTabAHUd4wlGYSMVkh9yr2GEpxAqej83kZ0pEwTG-vnD8rzGUCe4DJRkSxex38KITybBw5UOWxxkCOVN76jSbwfHwumrxpY7-AIrnWD5aiR2SMjY7LYFqk5eV8tDweWsqqdX_RUAOvz71lu6w_L7DWPjnWLdalrWAg2EeeDWOtxreg6GNGZXtja6dT1-UGDCb0ZtgWdA7rXewQ9rDgceVn_XPnBrx71BQOJqgHt17-vHGhcrcG03DHugHROV3QASmBlHLUf6RRXhN9LWDonjd0qQUuh35grq8uJQJnQD3NuXXN6ocJldP6G0VxS7m==

Bytecode Python VM

bytecode:

  • Python source code is compiled into bytecode, the internal representation of a Python program in the CPython interpreter.

  • The bytecode is also cached in .pyc files so that executing the same file is faster the second time (recompilation from source to bytecode can be avoided).

  • This “intermediate language” is said to run on a virtual machine that executes the machine code corresponding to each bytecode.

  • Do note that bytecodes are not expected to work between different Python virtual machines, nor to be stable between Python releases.

Компилируем в bytecode

Откроем проект и запустим файл compile_example.py:

python3 compile_example.py

А затем исследуем содержимое директории проекта:

.
├── compile_example.py
├── spc
│   ├── __init__.py
│   ├── mandelbrot.py
│   ├── __pycache__
│   │   ├── __init__.cpython-311.pyc
│   │   ├── mandelbrot.cpython-311.pyc
│   │   └── run.cpython-311.pyc
│   └── run.py

В корне пакета spc появилась директория __pycache__ в которой содержатся файлы с байткодом.

Компиляция с дополнительными опциями

Python позволяет компилировать с дополнительными опциями:

python3 -O compile_example.py
# remove assert and __debug__-dependent statements;
# or
python3 -OO compile_example.py
# do -O changes and also discard docstrings

Смотрим ByteCode наглядно с модулем dis

Try Replite!
import dis
dis.dis("a=1;a+=1;")
dis.dis("a=1;a = a + 1;")