Условие
Объясни различия pandas / Dask / Polars и матрицу выбора: «если у меня X ГБ данных и Y задача — что брать».
Решение
Сравнение
| pandas | Dask | Polars | |
|---|---|---|---|
| Модель | в памяти, один поток | партиции pandas, ленивый граф, многопоток/кластер | Rust, lazy, многопоток на одной машине |
| Лимит данных | ~1/3 RAM | до петабайт на кластере | до RAM (но эффективнее pandas в 5–10 раз) |
| API | известный | почти pandas | свой (похож на Spark) |
| Когда брать | <1 ГБ интерактивно | >RAM + кластер | 1–100 ГБ на одной машине, быстрее всего |
Матрица выбора
- < 1 ГБ, EDA → pandas. Не оптимизируйте.
- 1–10 ГБ, одна машина → polars (или pandas + чанки). Polars быстрее в 5–10×.
- 10–500 ГБ, одна большая машина → polars lazy + parquet.
- >500 ГБ или кластер → Dask / Spark / DuckDB.
- Single-file аналитика на parquet → DuckDB (
duckdb.sql("...").df()).
Polars lazy пример
import polars as pl
q = (
pl.scan_parquet('events.parquet')
.filter(pl.col('country') == 'RU')
.group_by('user_id')
.agg(pl.col('amount').sum())
)
df = q.collect() # план оптимизируется (push-down filter, projection)Dask пример
import dask.dataframe as dd
ddf = dd.read_parquet('s3://bucket/events/*.parquet')
result = ddf.groupby('user_id')['amount'].sum().compute()Подводные камни
- Dask не быстрее pandas на маленьких данных — overhead на граф. Точка перехода — около RAM.
- Polars API не совместим с pandas:
select,with_columns,group_by— заново учить. Зато гораздо консистентнее. - У Dask есть знаменитое «shuffle expensive»: groupby по высокой кардинальности в кластере = боль. Полезно
set_indexзаранее. - Polars не любит много мелких parquet — компактьте в файлы по 256 МБ–1 ГБ.
- Для интерактивного анализа на parquet часто проще всего DuckDB — SQL прямо по файлу, выигрывает по UX.
Эталонный ответ
До 1 ГБ — pandas. 1–100 ГБ на одной машине — polars lazy. Кластер/петабайты — Dask/Spark. SQL по parquet — DuckDB.