What lazy means
An eager DataFrame call (df.filter(...), df.select(...)) materialises the result in memory immediately. A lazy DataFrame call records the operation into a logical plan and returns without executing. Nothing materialises until you call .collect().
The difference is not just throughput. Eager execution forces every intermediate result into RAM in the order the user wrote the code. Lazy execution gives the optimiser the entire pipeline at once — it can reorder, drop, and fuse operations because it sees what the final result needs, not just the next step.
Polars exposes both modes. pl.DataFrame.filter(...) is eager; pl.LazyFrame.filter(...) is lazy. pl.scan_parquet() returns a LazyFrame; pl.read_parquet() returns an eager DataFrame.