← Назад к вопросам
Встречал ли библиотеки, которые компилируются 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
| Библиотека | На чём | Почему |
|---|---|---|
| NumPy | C/Fortran | Числовые вычисления |
| SciPy | C/Fortran | Научные вычисления |
| Pandas | C | Работа с данными |
| Pillow | C (libjpeg, libpng) | Обработка изображений |
| PyYAML | C | Парсинг YAML |
| ujson | C | Быстрый парсинг JSON |
| lxml | C (libxml2) | Парсинг XML |
| Cryptography | Rust/C | Шифрование |
| psycopg2 | C | Драйвер PostgreSQL |
| pyzmq | C++ (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.