← Назад к вопросам

Может ли Python быть компилируемым?

1.6 Junior🔥 121 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Может ли Python быть компилируемым?

Да, Python может быть компилируемым! На самом деле, Python уже включает внутри себя компиляцию.

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

Как Python обрабатывает код

Этап 1: Компиляция в bytecode

# Исходный файл: script.py
print("Hello, World!")
x = 5 + 3

# Python компилирует это в bytecode и сохраняет в __pycache__/
# Файл: __pycache__/script.cpython-39.pyc
$ python script.py
# За сценой происходит:
# 1. Python читает script.py
# 2. Компилирует в bytecode (виртуальный машинный код)
# 3. Интерпретирует bytecode (выполняет)

Ты можешь увидеть скомпилированный bytecode:

import py_compile
import sys

# Компилировать файл в bytecode
py_compile.compile('script.py', cfile='script.pyc')

# Или использовать disassemble для просмотра bytecode
import dis

code = compile("x = 5 + 3", "<string>", "exec")
dis.dis(code)

# Вывод:
#   1           0 LOAD_CONST               1 (5)
#               2 LOAD_CONST               2 (3)
#               4 BINARY_ADD
#               6 STORE_NAME               0 (x)
#               8 LOAD_CONST               0 (None)
#              10 RETURN_VALUE

Это виртуальный машинный код — типичный результат компиляции!

Этап 2: Интерпретация bytecode

Python Virtual Machine (PVM) читает и выполняет этот bytecode:

# PVM выполняет:
#   LOAD_CONST 5
#   LOAD_CONST 3
#   BINARY_ADD
#   STORE_NAME x

Архитектура Python

┌─────────────────────────────────────────┐
│         Исходный код Python             │
│        (script.py)                      │
└──────────────┬──────────────────────────┘
               │
         ┌─────▼──────┐
         │  COMPILER  │  ← Компилирует в bytecode
         └─────┬──────┘
               │
         ┌─────▼──────────────────┐
         │   Bytecode (.pyc)      │
         │   Virtualа Machine Code│
         └─────┬──────────────────┘
               │
         ┌─────▼──────┐
         │   PVM      │  ← Интерпретирует bytecode
         │ (Virtual   │
         │  Machine)  │
         └─────┬──────┘
               │
         ┌─────▼──────┐
         │   Результат│
         └────────────┘

Python компилируется в true machine code: AOT компиляция

Cython — компиляция Python в C

# hello.pyx (файл Cython, расширение .pyx)
def fibonacci(int n):
    cdef int a, b
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print(fibonacci(100))

Compile to C:

cythonize -i hello.pyx

Это генерирует:

  1. hello.c — исходный код на C
  2. hello.so — скомпилированный бинарный файл

Теперь это работает как native код — очень быстро!

# Использование
import hello
result = hello.fibonacci(100)  # Выполняется в машинном коде!

Результат: Python код скомпилирован в machine code и выполняется напрямую процессором.

PyPy — JIT компиляция

PyPy компилирует Python bytecode в машинный код во время выполнения (JIT — Just-In-Time):

# Установка PyPy
pip install pypy3

# Выполнение скрипта
pypy3 script.py
# script.py
def sum_range(n):
    total = 0
    for i in range(n):
        total += i
    return total

print(sum_range(1000000))
Время выполнения:
- CPython (интерпретация bytecode): 50ms
- PyPy (JIT компиляция в machine code): 2ms  ← 25x быстрее!

PyPy компилирует горячие циклы в machine code, что даёт резкое увеличение производительности.

Numba — компиляция функций в LLVM

from numba import jit
import numpy as np

# Этот декоратор компилирует функцию в машинный код
@jit(nopython=True)
def compute_sum(array):
    result = 0
    for i in range(array.shape[0]):
        result += array[i]
    return result

arr = np.arange(1000000)
print(compute_sum(arr))

Numba использует LLVM компилятор для создания машинного кода. Это как писать на C, но с синтаксисом Python!

mypy и py2exe — статическая компиляция

# py2exe компилирует Python в standalone exe
py2exe -c script.py -o script.exe

# Результат: исполняемый файл без интерпретатора

Сравнение подходов

ПодходСкоростьПроцессПример
CPython (по умолчанию)БазоваяКомпиляция + интерпретацияpython script.py
CythonОчень быстроКомпиляция в C, затем в machine code.pyx.so
PyPyБыстроJIT компиляция во время выполненияpypy3 script.py
NumbaОчень быстроКомпиляция функций в LLVM@jit декоратор
py2exeБыстроКомпиляция в .exepy2exe.exe

Практический пример: Cython для ускорения

Исходный Python (медленно)

# slow_algorithm.py
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)

for i in range(1000):
    result = factorial(100)
    print(result)
$ time python slow_algorithm.py
real    0m5.234s

Cython версия (быстро)

# fast_algorithm.pyx
def factorial(int n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)
# setup.py
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("fast_algorithm.pyx")
)
$ python setup.py build_ext --inplace
$ time python -c "from fast_algorithm import factorial; [factorial(100) for _ in range(1000)]"
real    0m0.023s  # Более чем в 200 раз быстрее!

Когда использовать компилируемый Python

Используй Cython, если:

  • ❌ CPU-интенсивные вычисления (математика, обработка данных)
  • ❌ Тугие циклы с числовыми операциями
  • ❌ Нужна скорость близкая к C
# Плохо для Python (медленно)
def process_image(pixels):
    for i in range(1000000):
        for j in range(1000000):
            pixels[i][j] = pixels[i][j] * 2  # Медленно в Python

# Хорошо с Cython
cdef process_image_fast(double[:,:] pixels):
    cdef int i, j
    for i in range(1000000):
        for j in range(1000000):
            pixels[i, j] = pixels[i, j] * 2  # Быстро как C!

Используй PyPy, если:

  • ✅ Long-running приложение (сервер, демон)
  • ✅ Нет зависимостей от CPython (numpy, pandas)
  • ✅ Нужна автоматическая оптимизация JIT
# PyPy хороша для web приложений
pypy3 -m pip install flask
pypy3 app.py

Вывод

Python может быть компилируемым несколькими способами:

  1. Python по умолчанию — компилируется в bytecode, затем интерпретируется
  2. Cython — компилируется в C, затем в машинный код (ОЧЕНЬ быстро)
  3. PyPy — JIT компиляция во время выполнения (быстро)
  4. Numba — компиляция функций в LLVM (очень быстро для численных вычислений)
  5. py2exe — компиляция в standalone .exe для Windows

Поэтому Python не является чисто интерпретируемым языком — это гибрид с встроенной компиляцией. Если нужна ещё большая скорость, есть инструменты для AOT (Ahead-of-Time) компиляции прямо в машинный код!

Может ли Python быть компилируемым? | PrepBro