Как ускорить медленный код на pandas
Вопрос
Ноутбук аналитика считает метрики 30 минут. Как будете ускорять?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Профилирование: `%%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 ошибок.
Термины по теме
Ещё по теме «Производительность и память»
- Чем заменить apply(axis=1)
- Когда помогает тип category
- Цепочное присваивание в pandas 3.0
- Обнулить тестовые заказы через loc
- Скидка по категории через map
- Категории сумм через np.select
- Ужать DataFrame: category и downcast
- category теряется при concat