Как ускорить медленный Python-сервис
Вопрос
Ваш Python-сервис стал отвечать медленно. Как вы будете искать причину и что можете сделать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Метрики и трейсы: какой эндпоинт, p95/p99, где время (БД, внешние API, CPU)
Профилирование: py-spy на живом процессе, cProfile локально
Типичные причины: N+1 запросы, отсутствие индексов, синхронные вызовы в async, неверные структуры данных
Исправления: батчи и prefetch, кеш, индексы, перенос тяжёлого в фон
CPU-bound: алгоритм, встроенные функции, numpy, процессы
Проверка результата нагрузочным тестом
Что могут спросить следом
- Как вы найдёте блокирующий вызов в asyncio-сервисе?
- Когда стоит переписывать часть на Rust или C?
Разбор
Образцовый ответ: «Сначала смотрю наблюдаемость: какие эндпоинты замедлились, как выросли p95 и p99, и по трейсам, где уходит время: в базе, во внешних вызовах или в самом Python. В большинстве случаев виноват не язык: N+1 запросов в цикле, отсутствующий индекс, синхронный HTTP-вызов внутри async-обработчика или внешний сервис без таймаута. Если время уходит в CPU, подключаю py-spy к живому процессу и смотрю flame graph, локально воспроизвожу с cProfile. Дальше исправления по причине: select_related и батчи вместо запросов в цикле, индекс, кеш на дорогие вычисления, перенос тяжёлого в фоновую очередь. Для вычислений сначала алгоритм и структуры данных, set вместо списка, встроенные функции, numpy; если упираемся в ядра, процессы. Переписывать на Rust или C имеет смысл, когда профиль показывает узкую горячую функцию, которую уже нечем ускорить в Python. В конце подтверждаю эффект нагрузочным тестом и метриками».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Найти пару с суммой быстрее O(n²)
- Циклические ссылки и gc
- Управление памятью в CPython
- Инструменты профилирования Python