Limiti di pandas
pandas (Wes McKinney, 2008) è la libreria DataFrame dominante di Python, ma mostra limiti su scale moderne:
- Single-thread di default — non sfrutta CPU multi-core
- Eager evaluation — ogni operazione esegue immediatamente
- Memoria — DataFrame eager-loaded in RAM, problemi con dati > memoria
Polars, creato da Ritchie Vink (ingegnere olandese) dal 2020, risponde con riscrittura in Rust:
- Rust core con Arrow format sottostante
- Lazy evaluation — chain di operazioni ottimizzate prima dell’esecuzione
- Multi-threaded di default
- Streaming — dataset più grandi di RAM
- Query optimizer — predicate pushdown, projection pushdown
Licenza MIT. La versione 0.14-0.15 (autunno 2022) consolida maturità produzione, 1.0 raggiunta luglio 2024.
API
Polars ha due modalità:
Eager (familiare a pandas):
import polars as pl
df = pl.read_csv("data.csv")
result = df.filter(pl.col("age") > 30).group_by("country").agg(pl.col("salary").mean())
Lazy (ottimizzata):
result = (
pl.scan_csv("data.csv")
.filter(pl.col("age") > 30)
.group_by("country")
.agg(pl.col("salary").mean())
.collect()
)
In lazy mode, Polars costruisce un execution plan, lo ottimizza, poi esegue con minimo overhead.
Performance
Benchmark pubblici (TPC-H, DB-benchmark): Polars 10-100x più veloce di pandas su dataset medi-grandi. Competitivo con Spark su single-node; Dask/Ray per distribuito.
Interoperabilità
Polars integra con:
- pandas —
.to_pandas()e.from_pandas() - NumPy
- Arrow (formato dati condiviso con Spark, DuckDB, altri)
- Parquet, CSV, JSON, Avro
- PyArrow, pyarrow-flight
Nel contesto italiano
Adoption rapida in data team italiani dal 2023 per scenari dove pandas è troppo lento ma Spark è overkill.
Riferimenti: Polars. Ritchie Vink. Rust + Python bindings. Licenza MIT. Arrow format. Lazy evaluation + query optimizer. 1.0 (luglio 2024). Alternativa moderna a pandas.
