
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 等)默认不保证行序。如果你依赖这些操作的可观察行序,需要显式声明:
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_order 或 engine 参数即可,迁移文档里给了完整的对照。
—— 广告 ——
更严格的 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 还新增了两个类型化异常:AttributeRemovedError 和 ArgumentRemovedError,分别处理被移除的方法和被移除的参数。关键在报错信息直接告诉你迁移路径:
>>> 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 最需要的类型。
© 2026 四月
原文链接:https://www.aprilzz.com/tools/polars-2-0-preview
相关文章
walgit:把 Git 仓库直接塞进对象存储的服务器,单二进制搞定,仓库比机器还大也能跑
walgit 是 Shopify CEO Tobi Lütke 开源的 Rust Git 服务器:无数据库、无主节点、无本地状态,一个二进制指向 S3 桶就是完整部署。支持 bundle-uri、LFS、Web UI,仓库规模可以超过机器本身。
Rust Glancer:把 Rust 语言服务器的内存压到 100MB 以下,rust-analyzer 之外的轻量选择
一个花了 4 个月开发的 Rust LSP 替代实现,通过'冻结分析结果'的核心设计,把大型项目的语言服务器内存占用从 GB 级压到 100MB 以下,还能免重索引热重启。
OpenLogi:告别 Logitech Options+,用开源 Rust 工具本地接管你的鼠标
1428 分登顶 HN 的本地优先工具:Rust 编写、通过 HID++ 直接驱动罗技外设,重映射按键、控制 DPI、SmartShift,无账号无遥测,配置就是一份你拥有的 TOML 文件。