Когда Python становится слишком медленным
Прочел статью про pyrusmorph (C ядро для Python), где бенчмарки показали ускорение в 30 раз. Задался вопросом - как простой import дает доступ к с коду? Решил поресерчить и поделится: от чистого C-API до JIT-компиляции. Почему Python медленный? Даже простой цикл total += n * n - это нагрузка на процессор. Каждое число в Python - это PyObject в куче (заголовок 16 байт + значение 8 байт + оверхед аллокатора). На каждой итерации интерпретатор проверяет типы, создает новый объект и управляет refcount. В C это одна инструкция процессора mulsd над регистрами. Уровень Хардкода: C-API Мы пишем код, напрямую работающий с PyObject. Нужно вручную парсить аргументы (PyArg_ParseTuple), проверять типы (PyList_Check) и управлять памятью. Ошибка = segfault или утечка. Собирается через setup.py в .so или .pyd. Работает быстро, но кода очень много. Уровень Разумный: pybind11 Эта C библиотека оборачивает C-API. Вместо PyObject* мы пишем обычный C: double sum(const std::vector<double>& numbers). Конвертация типов и управление памятью происходят автоматически. Код сокращается примерно раз в 10. Бенчмарки (10 млн чисел, HONOR MagicBook 14, Python 3.11): Чистый Python: 0.2521 сек Pybind11 (со списком): 0.1129 сек Чистый C-API (со списком): 0.0528 сек Numba (JIT): 0.0093 сек NumPy: 0.0032 сек Инсайт: Pybind11 оказался медленнее чистого C-API. Конвертация Python-списка в std::vector создает оверхед. Вывод: инструменты нужно выбирать под конкретную структуру данных. Бонус: Магия Numba (JIT) Зачем писать на с, если можно просто завернуть функцию в декаратор? Numba компилирует Python-код в машинный через LLVM на лету. Она применяет SIMD-векторизацию, которую вручную на C написать сложно. Минусы: не поддерживает все фичи Python (словари, сложные классы) и имеет оверхед первого запуска (лечится флагом cache=True). Ссылки: Исходный код и скрипты для локального запуска: https://github.com/stl2802/Different-types-of-compilations Полная версия моей статьи с детальным разбором кода и C-API на моем Хабре: https://habr.com/ru/articles/1101090/ Буду рад фидбеку, звездам на GitHub и обсуждению в комментариях!