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

Встречал ли библиотеки, которые компилируются C-кодом

1.8 Middle🔥 151 комментариев
#Python Core

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

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

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

Встречал ли библиотеки, которые компилируются из C-кода

Да, много! Это очень распространённая практика в Python для performance-critical кода.

NumPy - классический пример

NumPy полностью написан на C/Fortran для скорости.

import numpy as np

# Работаешь с Python API
arr = np.array([1, 2, 3, 4, 5])
result = np.dot(arr, arr)  # Это C код под капотом!

# NumPy написан так:
# - Интерфейс: Python
# - Реализация: C/Fortran
# - Результат: 100x быстрее чем pure Python

Почему C?

  • Python медленный для числовых операций
  • C работает с памятью напрямую
  • NumPy 95% написан на C
# Pure Python (медленно)
def matrix_mult(a, b):
    result = []
    for i in range(len(a)):
        row = []
        for j in range(len(b[0])):
            sum_val = 0
            for k in range(len(b)):
                sum_val += a[i][k] * b[k][j]
            row.append(sum_val)
        result.append(row)
    return result

# NumPy (быстро - вызывает C код)
np.dot(a, b)

Pandas - на основе NumPy

import pandas as pd

# Чтение CSV с 1 млн строк - очень быстро
df = pd.read_csv('huge_file.csv')

# Потому что внутри C код:
# - Парсинг CSV - C
# - Группировка - C
# - Агрегирование - C

Cryptography

from cryptography.fernet import Fernet

# Шифрование/дешифрование - критичный для скорости
token = Fernet(key).encrypt(b"secret")

# Написано на Rust с Python биндингами
# OpenSSL - pure C

SQLAlchemy / psycopg2

import psycopg2

# Подключение к PostgreSQL
conn = psycopg2.connect("dbname=test")

# Драйвер psycopg2:
# - Написан на C
# - Общается с PostgreSQL на протоколе libpq (C)
# - Очень быстро

Pillow (обработка изображений)

from PIL import Image

# Открытие и обработка изображения
img = Image.open('photo.jpg')
img.resize((800, 600))

# Pillow - это обёртка над libjpeg, libpng (всё на C)
# Без C это было бы очень медленно

Компиляция C-кода в Python

Как это работает:

Python код (*.py)
    |
    v
C/C++ код (*.c, *.cpp)
    |
    v [gcc/clang/MSVC компилятор]
    |
    v
Compiled binary (.so на Linux, .pyd на Windows, .dylib на Mac)
    |
    v
Python import

Примеры библиотек на C

БиблиотекаНа чёмПочему
NumPyC/FortranЧисловые вычисления
SciPyC/FortranНаучные вычисления
PandasCРабота с данными
PillowC (libjpeg, libpng)Обработка изображений
PyYAMLCПарсинг YAML
ujsonCБыстрый парсинг JSON
lxmlC (libxml2)Парсинг XML
CryptographyRust/CШифрование
psycopg2CДрайвер PostgreSQL
pyzmqC++ (ZeroMQ)Асинхронная очередь

Как установить?

# Если есть wheel (pre-compiled binary)
pip install numpy
# Скачивается .whl файл с готовым C кодом

# Если нет wheel, компилируется из исходника
# Требует gcc/clang и dev headers
pip install numpy --no-binary :all:

Проблема: если нет компилятора, install может упасть.

# Linux - установи компилятор
apt-get install build-essential python3-dev

# macOS
xcode-select --install

# Windows
# Скачай Visual C++ Build Tools

Проверить: это C код или Python?

import inspect
import numpy

# Попробуем посмотреть исходник
print(inspect.getsource(numpy.dot))  # ❌ Ошибка - нет исходника

# Это встроенная функция на C
print(numpy.dot)  # <built-in function dot>

# В отличие от pure Python
from mymodule import my_function
print(inspect.getsource(my_function))  # ✓ Работает

Performance сравнение

import numpy as np
import time

# Pure Python
def python_sum(arr):
    total = 0
    for x in arr:
        total += x
    return total

# NumPy (C)
def numpy_sum(arr):
    return np.sum(arr)

# Тест
arr = list(range(1_000_000))
np_arr = np.array(arr)

start = time.time()
python_sum(arr)
print(f"Python: {time.time() - start:.3f}s")  # 0.03s

start = time.time()
numpy_sum(np_arr)
print(f"NumPy: {time.time() - start:.3f}s")  # 0.001s

# NumPy в 30x быстрее!

Написание своих C расширений

# setup.py
from setuptools import setup, Extension

module = Extension(
    'my_module',
    sources=['my_module.c']  # C исходник
)

setup(
    name='my_module',
    ext_modules=[module]
)

# bash
python setup.py build_ext --inplace
# Скомпилирует C код в .so файл

# Потом используем как обычно
import my_module
my_module.my_function()

Ctypes - вызов C библиотек

from ctypes import CDLL, c_int, c_double

# Загруза C библиотеку
lib = CDLL('./libmath.so')

# Вызов C функции
lib.add.argtypes = [c_int, c_int]
lib.add.restype = c_int

result = lib.add(5, 3)
print(result)  # 8

PyO3 / maturin - Rust в Python

Новый тренд: использовать Rust вместо C

# Это Python API, но реализация на Rust
from my_rust_module import fast_function

result = fast_function([1, 2, 3, 4, 5])

Преимущества Rust:

  • Памяти безопасность (нет segfaults)
  • Быстро как C
  • Проще писать чем C

Когда использовать C расширения

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

  • Нужна высокая производительность (1000x+ медленнее в Python)
  • Много числовых вычислений
  • Обёртка над C/C++ библиотекой
  • Критичные по производительности задачи

Не используй если:

  • Можно жить с Python скоростью
  • Нет опыта в C
  • Простая логика (сложнее поддерживать)

Проблемы с C расширениями

# 1. Segmentation fault
# C может крашить весь Python процесс

# 2. GIL проблемы
# Может блокировать другие потоки

# 3. Сложно дебажить
# Нужен gdb, не работает pdb

# 4. Кроссплатформенность
# Нужно компилировать на разных ОС

Заключение

  • NumPy, Pandas, Pillow - классические примеры
  • C расширения дают 10-100x ускорение
  • Используй когда производительность критична
  • Не пиши сам если можно использовать готовую библиотеку
  • Новый тренд - Rust вместо C (безопаснее, быстрее писать)

Python популярен именно потому что можно писать медленный код на Python и ускорять критичные части на C/Rust.