Вопрос с собеседования · Python

Почему Python медленный и как ускорить вычисления?

MiddleСложность и производительностьPython >=3.11
Ещё спрашивают так:
  • Чем помогают 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 в куче, подсчёт ссылок. Цикл по миллиону чисел — миллионы таких операций.

Что помогает, по возрастанию усилий:

  1. Алгоритм и структуры данных: set вместо list для проверок принадлежности, словарь вместо поиска в цикле.
  2. Встроенные и стандартная библиотека — циклы внутри на C: sum(x*x for x in xs) медленнее np.dot(arr, arr) в десятки раз, но быстрее ручного цикла с накоплением.
  3. NumPy / pandas / polars — операции над массивами целиком.
  4. Numba, Cython, Rust (PyO3) — компиляция горячей функции.
  5. PyPy — альтернативный интерпретатор с JIT, ускоряет чистый Python в разы, но совместимость с C-расширениями хуже.
  6. Параллелизм — процессы или free-threaded сборка.

Версии CPython: 3.11 — специализирующий адаптивный интерпретатор (PEP 659), заметный прирост без изменения кода; 3.13 — экспериментальный JIT (copy-and-patch).

Что хотят услышать

  • Причины медлительности.
  • Способы ускорения по возрастанию усилий.
  • Начинать с профиля и алгоритма.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Векторизация через NumPy и pandas вместо циклов
  • ✓Встроенные функции вместо ручных циклов
  • ✗Потоки для ускорения вычислений на нескольких ядрах в обычном CPython
  • ✓Расширения на Cython или Rust для горячих мест

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования