Расскажите про опыт оптимизации
Что проверяют
Есть ли у вас метод. Оптимизация это цикл «измерил, нашёл узкое место, починил, измерил снова», и интервьюер слушает именно порядок действий. Заодно проверяют, понимаете ли вы, где в Python обычно теряется время: чаще всего не в самом Python, а в ожидании базы и сети.
Как отвечать
Расскажите один случай целиком, по шагам.
- Что было плохо и для кого: время ответа на p95, длительность ночного расчёта, потребление памяти, стоимость серверов. Обязательно с числом до начала работ.
- Чем измеряли: cProfile на воспроизводимом сценарии, py-spy на живом процессе без его остановки, построчный профиль горячей функции, трассировка запроса по сервисам, счётчик обращений к базе.
- Что нашли: обычно это N+1 в ORM, отсутствующий индекс, выборка всех колонок подряд, сериализация лишних данных, повторный вызов внешнего сервиса внутри цикла.
- Что сделали и в каком порядке: сначала убрали лишнюю работу, потом индексы и пакетная обработка, затем кэш, и только в конце переписывание кода. Для счётных задач отдельная ветка: векторные операции или вынос в отдельные процессы.
- Чем закончили: повторный замер и метрика в мониторинге с порогом, чтобы деградация не вернулась незаметно.
Где спотыкаются
Оптимизируют по интуиции. Переписывают циклы и меняют структуры данных там, где основное время уходит на ожидание ответа базы. Без профиля выигрыш считается в процентах от того, что и так занимало доли процента.
Считают асинхронность синонимом ускорения. Перевод кода на asyncio помогает держать много ожидающих операций, но один блокирующий вызов внутри корутины останавливает весь цикл событий, а расчёт, упирающийся в процессор, быстрее не станет.
Ставят кэш первым шагом. Кэш прячет проблему и приносит свою: устаревшие данные, расхождение между экземплярами, лавина запросов после истечения ключа. Прежде чем кэшировать, стоит понять, почему исходный запрос дорогой.