Polars:用 Rust 重写 DataFrame,快到离谱

Polars 在 GitHub 上已经拿到 38,661 Star 了。

这是一个用 Rust 写的 DataFrame 查询引擎。如果你还在用 pandas 处理大规模数据,可能已经吃过内存爆掉的苦。Polars 就是冲着解决这个问题来的,速度更快、内存更省,API 还更干净。

1、 这玩意儿是干嘛的

Polars 只做一件事:让你用 DataFrame 的方式做数据分析,但比传统工具快一个数量级。

它支持两种执行模式。Eager 模式像 pandas,操作立即执行。Lazy 模式则会把你的查询攒起来,自动优化后再跑,省去很多中间计算。对于大于内存的数据集,它能用流式处理,250GB 的数据在笔记本上也能跑。

前端支持 Python、Rust、Node.js、R,还有 SQL。底层基于 Apache Arrow 列式格式,现代硬件上的 SIMD 指令和多核都能用起来。

正文顶部截图

2、 到底有多快

Polars 的 import 时间是 70ms。numpy 要 104ms,pandas 是 520ms。

这还只是启动速度。实际查询性能上,Polars 在 PDS-H 基准测试里常年排在最前面。它的查询引擎会自动做谓词下推、投影消除这些优化,你写的代码它会在背后改得更高效。

零依赖也是个亮点。装完就能用,不用拉一堆附属包。

3、 核心特性

  • 惰性/即时执行两种模式
  • 流式处理,内存不够也能跑
  • 查询优化,自动改写成更高效的执行计划
  • 多线程,CPU 核心能拉满
  • SIMD 向量指令加速
  • 表达式 API,链式调用写复杂逻辑很顺手

README区域截图

4、 安装使用

Python 用户直接 pip:

pip install polars

简单查询长这样:

import polars as pl

df = pl.read_csv("data.csv")
result = df.filter(pl.col("age") > 25).group_by("city").agg(pl.col("salary").mean())

Lazy 模式加个 .lazy() 就行:

df.lazy().filter(pl.col("age") > 25).collect()

内存不够的时候用流式:

df.lazy().filter(pl.col("age") > 25).collect(engine='streaming')

5、 适合哪些人

  • 用 pandas 处理数据量上来后明显卡顿的数据分析师
  • 需要高性能 DataFrame 操作的 Python/R 开发者
  • 做 ETL 流水线、对执行速度和内存占用敏感的基础设施团队

Polars 不是什么新概念包装器,是从底层用 Rust 重新实现的查询引擎。如果你每天和数据打交道,值得一试。

占用敏感的基础设施团队

Polars 不是什么新概念包装器,是从底层用 Rust 重新实现的查询引擎。如果你每天和数据打交道,值得一试。

更多推荐