工具推荐·阅读约 2 分钟·
Polars 2.0 RC 发布:所有查询默认走流式引擎,内存大降、性能预期 5 倍提升

Polars 2.0 RC 发布:所有查询默认走流式引擎,内存大降、性能预期 5 倍提升

Polars 2.0 首个候选版发布:LazyFrame 查询默认改用流式引擎,多数查询内存占用和性能大幅改善,团队预期整体 5 倍提升;同时全面收紧类型行为——数据不匹配直接报错而不是静默出错,还新增了会告诉你迁移路径的 AttributeRemovedError 异常。

原文来源:Polars 官方博客 — Polars 2.0 的目标是当一次"无聊"的大版本:不堆新功能,把默认引擎换成流式执行、把隐式的类型转换全部改成立刻报错。

9 月 2 日,Polars 团队发布了 2.0 的第一个 release candidate,正式版将在几周内落地。主创 Ritchie Vink 在公告里说得很直白:2.0 不打算做功能大发布,甚至希望它对你是"无聊"的体验——升级主版本号,是为了甩掉过去阻碍发展的设计决策,把默认行为改成对大多数用户更合理的设置。

但"无聊"只是客套。这次升级动了两个最底层的东西:默认执行引擎,和错误处理哲学。

最大变更:LazyFrame 默认跑流式引擎

2.0 影响面最大的改动,是调用 collect() 时,LazyFrame 查询默认走流式引擎(streaming engine),而不是原来的内存引擎。对普通用户来说,这意味着大多数查询的内存占用和性能会立刻大幅改善——团队预期整体能到 5 倍提升,处理超内存数据时不再需要手动折腾。

为什么这个改动需要 bump 主版本号?因为流式引擎对某些操作(join、group_by、unpivot 等)默认不保证行序。如果你依赖这些操作的可观察行序,需要显式声明:

code
lf = pl.LazyFrame({"k": [2, 1, 0], "v": ["a", "b", "c"]})
other = pl.LazyFrame({"k": [0, 1, 2], "r": ["x", "y", "z"]})
 
# 2.0 中 engine="auto" 现在解析为流式引擎
# join、group_by、unpivot 等操作不再保证行序
lf.join(other, on="k", how="left").collect()
 
# 需要可观察行序时显式 opt-in:
lf.join(other, on="k", how="left", maintain_order="left").collect()
 
# 或者全进程切回旧引擎:
pl.Config.set_engine_affinity("in-memory")
 
# 也可以只对单个查询生效:
lf.join(other, on="k", how="left").collect(engine="in-memory")

想保留旧行为的老用户,用 maintain_orderengine 参数即可,迁移文档里给了完整的对照。

—— 广告 ——

更严格的 Polars:错误往前抛

Polars 一直标榜"严格、快速失败":错误应该在一开始就暴露,而不是跑 20 分钟管线后才发现。这种严格在 AI 驱动的开发时代变得更有价值——Agent 可以先用 collect_schema() 提前验证查询结构、在不动数据的情况下捕获 schema 层面的错误,从而快速迭代。

2.0 把一批过去"好心办坏事"的隐式转换全部改成了报错:

跨类型 is_in 不再静默强转。 以前检查 user_id 是否在 flagged 列表里,如果列表被 JSON 导出成了 Float64,Polars 会把两边都转成公共超类型——哪怕转换有损。超过 2^53 的整数在 Float64 里无法精确表示,9007199254740993 会被静默舍入成 9007199254740992.0,给出错误的"命中"。2.0 直接抛 InvalidOperationError,逼你显式处理类型。

横向 concat 检查长度。 以前把每日交易数和每日风控标记数横向拼接,如果上游某天任务悄悄失败少了一行,结果会静默补 null,数据缺了没人知道。2.0 直接抛 ShapeError;想要补齐就用 how="horizontal_extend" 显式表达意图,让读者一眼看懂。

一批有歧义的 cast 被移除。 u32 转 Enum、字符串直接 cast 成 Date 这类操作不再支持——字符串解析请用 .str.to_date() / .str.to_datetime(),还能顺便指定解析格式。

会指路的报错

Polars 还新增了两个类型化异常:AttributeRemovedErrorArgumentRemovedError,分别处理被移除的方法和被移除的参数。关键在报错信息直接告诉你迁移路径:

code
>>> lf.melt(id_vars="a", value_vars="b")
polars.exceptions.AttributeRemovedError: `melt` was removed in version 2.0;
use `LazyFrame.unpivot` instead, with `index` instead of `id_vars`
and `on` instead of `value_vars`
 
>>> df.join(df, on="a", join_nulls=True)
polars.exceptions.ArgumentRemovedError: the argument 'join_nulls' for
'DataFrame.join' was deprecated in version 1.24 and has been removed
in 2.0.0. It was renamed to 'nulls_equal' in version 2.0.

对 AI 编程助手来说这尤其友好——agent 拿到报错就知道该改成什么 API,不用反复试错。大部分被删的功能其实已经弃用很久,只要跟着版本更新走,管线基本不会踩雷。

2.x 的路线图

官方明确表示不会把新功能锁在大版本后面。已经在路上的有:流式引擎的完整 out-of-core 支持、新的 IO-plugin 设计、号称业界最快的 S3 reader、大幅提升的 SQL 覆盖、基于成本的查询规划器(cost-based planner)、join 重排序,以及移除 mmap 让管线端到端全异步。

想尝鲜的话:pip install polars==2.0rc1。社区反馈走 GitHub issues 或 Discord。对正在把数据分析管线交给 AI agent 的人来说,2.0 的方向值得关注——一个默认流式、严格报错、报错还自带迁移指引的数据工具,恰好是 agent 最需要的类型。

分享到
微博Twitter

© 2026 四月

原文链接:https://www.aprilzz.com/tools/polars-2-0-preview