
Polars 2.0 Pre-Release: Streaming Engine Becomes the Default
Polars has published the first release candidate of 2.0: streaming is now the default engine for LazyFrame queries, with stricter type handling and clearer errors.
Polars has published the first release candidate of version 2.0, with the final release expected in the coming weeks. Writing on the project's blog, lead developer Ritchie Vink stresses that the major version bump is not about features: it is about dropping old design decisions and moving defaults to more sensible settings.
Streaming becomes the default
The largest change is that every LazyFrame query now runs on the streaming engine. Calling collect() therefore delivers big reductions in memory usage and better performance on most queries; the project expects the streaming engine to be easily 5x faster in aggregate.
That change is precisely what required a major version, because the streaming engine does not guarantee row order for operations such as join, group_by and unpivot. Code that depends on observable row order must opt in with maintain_order=True, and users who prefer the old in-memory engine as the process-wide default can set the engine affinity through pl.Config.set_engine_affinity.
Stricter, with more informative errors
Polars 2.0 also tightens behaviour that used to fail quietly. An is_in expression across mixed types used to coerce both sides to a common supertype even when that conversion was lossy — the blog shows a user-ID comparison above 2^53 that silently rounded and produced a false positive; it now raises instead. Horizontal concatenation checks lengths rather than padding with nulls, and the old behaviour survives only as an explicit "horizontal_extend" option. Several ambiguous casts have been removed in favour of dedicated methods, such as .cat.to() and .str.to_date().
For removed APIs the project added two typed exceptions, AttributeRemovedError and ArgumentRemovedError, whose messages point to the replacement — melt having become unpivot, for example, and join_nulls having been renamed nulls_equal. The post also notes that early schema validation with collect_schema() is useful for AI agents, which can check the structure of a query before materialising any data.
What comes next
Vink says 2.x will move well beyond 1.x: out-of-core support for the streaming engine, a new IO-plugin design, work on what the team expects to be the fastest S3 reader, wider SQL coverage, a cost-based planner, join reordering, and the removal of mmap to make pipelines fully async end to end. A full migration guide is already available, and the release candidate installs with pip install polars==2.0rc1.
SiTech — AI-powered web development
We build fast, modern websites and bring AI into real business workflows. Have a project or a question? We'd love to help.