Выбор ответа Senior Производительность и память обновлено
Когда переходить на Polars или DuckDB
Вопрос
Ежедневный отчёт на pandas: join трёх таблиц по 50 млн строк и группировки, идёт 40 минут, память на пределе. Векторизация уже сделана. Какой шаг разумный?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Унести тяжёлые join и группировки в DuckDB или Polars на Parquet. DuckDB и Polars выполняют join и агрегаты многопоточно, читают Parquet по колонкам и оптимизируют план запроса.
Варианты ответа
- Переписать join и группировки на циклы Python с декоратором numba
- Унести тяжёлые join и группировки в DuckDB или Polars на Parquetправильный ответ
- Разбить отчёт на 50 ноутбуков и запускать их по очереди в Jupyter
- Поднять
pd.options.compute.use_numexprи число потоков pandas
Разбор
DuckDB и Polars выполняют join и агрегаты многопоточно, читают Parquet по колонкам и оптимизируют план запроса. На таких объёмах выигрыш обычно в разы. numba ускоряет числовые циклы, но join и группировки так не пишут. Разбиение на ноутбуки не уменьшает работу, а опции compute, которая сделала бы join и группировки pandas многопоточными, нет: numexpr ускоряет только арифметику выражений.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Производительность и память»
- Чем заменить apply(axis=1)
- Когда помогает тип category
- Цепочное присваивание в pandas 3.0
- Обнулить тестовые заказы через loc
- Скидка по категории через map
- Категории сумм через np.select
- Ужать DataFrame: category и downcast
- category теряется при concat