Выбор ответа Senior Производительность и память обновлено

Когда переходить на Polars или DuckDB

Вопрос

Ежедневный отчёт на pandas: join трёх таблиц по 50 млн строк и группировки, идёт 40 минут, память на пределе. Векторизация уже сделана. Какой шаг разумный?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Унести тяжёлые join и группировки в DuckDB или Polars на Parquet. DuckDB и Polars выполняют join и агрегаты многопоточно, читают Parquet по колонкам и оптимизируют план запроса.

Варианты ответа

  1. Переписать join и группировки на циклы Python с декоратором numba
  2. Унести тяжёлые join и группировки в DuckDB или Polars на Parquetправильный ответ
  3. Разбить отчёт на 50 ноутбуков и запускать их по очереди в Jupyter
  4. Поднять pd.options.compute.use_numexpr и число потоков pandas

Разбор

DuckDB и Polars выполняют join и агрегаты многопоточно, читают Parquet по колонкам и оптимизируют план запроса. На таких объёмах выигрыш обычно в разы. numba ускоряет числовые циклы, но join и группировки так не пишут. Разбиение на ноутбуки не уменьшает работу, а опции compute, которая сделала бы join и группировки pandas многопоточными, нет: numexpr ускоряет только арифметику выражений.

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

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