Ответ вслух Middle Производительность и память спрашивают часто обновлено

Как ускорить медленный код на pandas

Вопрос

Ноутбук аналитика считает метрики 30 минут. Как будете ускорять?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала меряю, а не гадаю: %%time по ячейкам, %prun для функций. Почти всегда тормозит одно место.

Что должно прозвучать в ответе

  • Профилирование: `%%time`, `%prun`, найти узкое место

  • Убрать `apply(axis=1)`, `iterrows`, циклы: векторные операции, `np.where`, `np.select`, `map`

  • Убрать `concat` в цикле, собирать список и склеивать один раз

  • Ужать типы: `category`, downcast, `usecols`

  • Фильтровать и агрегировать раньше, тяжёлое в SQL

  • Если мало: Polars, DuckDB

Что могут спросить следом

  • Почему iterrows медленный?
  • Когда category вредит?
  • Как проверить, что ускоренная версия считает то же?

Разбор

Сначала меряю, а не гадаю: %%time по ячейкам, %prun для функций. Почти всегда тормозит одно место. Самые частые: apply(axis=1) и iterrows для того, что пишется колонками, их заменяю на векторные операции, np.where, np.select и map со словарём. Второе: concat в цикле, который даёт квадратичное время, собираю куски в список. Третье: память. Строки с малым числом уникальных значений в category, числа даункастом, usecols при чтении. Четвёртое: фильтровать и агрегировать как можно раньше, а то, что можно, считать в базе. Новую версию сверяю со старой через pd.testing.assert_frame_equal. Если всё это сделано, а данных десятки миллионов строк, переношу тяжёлые join и группировки в DuckDB или Polars.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.