Почему Python медленный и как ускорить вычисления?
- Чем помогают NumPy, Cython и PyPy?
CPython — интерпретатор байткода с динамической типизацией: каждая операция проверяет типы, числа — объекты в куче. Ускорение: векторизация (NumPy, pandas — циклы на C), встроенные функции вместо ручных циклов, Cython/Rust-расширения для горячих мест, PyPy (JIT), процессы для параллелизма.
- Python 3.11 ускорен на 10–60% (адаптивный интерпретатор), 3.13 — экспериментальный JIT
- sum, sorted, set, dict, str.join реализованы на C
- Чаще узкое место — ввод-вывод и алгоритм, а не скорость интерпретатора
А ещё Numba компилирует числовые функции декоратором @njit
Подробно
Откуда медлительность: a + b — поиск метода __add__ по типам, создание нового объекта int в куче, подсчёт ссылок. Цикл по миллиону чисел — миллионы таких операций.
Что помогает, по возрастанию усилий:
- Алгоритм и структуры данных: set вместо list для проверок принадлежности, словарь вместо поиска в цикле.
- Встроенные и стандартная библиотека — циклы внутри на C:
sum(x*x for x in xs)медленнееnp.dot(arr, arr)в десятки раз, но быстрее ручного цикла с накоплением. - NumPy / pandas / polars — операции над массивами целиком.
- Numba, Cython, Rust (PyO3) — компиляция горячей функции.
- PyPy — альтернативный интерпретатор с JIT, ускоряет чистый Python в разы, но совместимость с C-расширениями хуже.
- Параллелизм — процессы или free-threaded сборка.
Версии CPython: 3.11 — специализирующий адаптивный интерпретатор (PEP 659), заметный прирост без изменения кода; 3.13 — экспериментальный JIT (copy-and-patch).
Что хотят услышать
- Причины медлительности.
- Способы ускорения по возрастанию усилий.
- Начинать с профиля и алгоритма.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Векторизация через NumPy и pandas вместо циклов
- ✓Встроенные функции вместо ручных циклов
- ✗Потоки для ускорения вычислений на нескольких ядрах в обычном CPython
- ✓Расширения на Cython или Rust для горячих мест
Разбор темы
- Память и производительность CPython
Подсчёт ссылок и сборщик циклов, слабые ссылки, интернирование чисел и строк, копирование, сложность операций, профилирование и способы ускорения.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.