Skip to content

认识Polars

你有没有经历过这种绝望:一份 5GB 的 CSV,用 pandas 读了 40 秒,做个 groupby 聚合又等了 2 分钟,内存直接爆到 16GB——然后程序崩了。

更绝望的是,你的同事用同样的数据,同样的操作,3 秒搞定,内存占用不到你的一半。他用的不是什么神秘工具,就是 Polars

2026 年,Polars 的 GitHub Star 已经突破 85k,是 Python 生态中增长最快的数据处理库。它不跟 pandas 打嘴仗,直接用性能碾压。

当一个工具比前辈快 30-90 倍,讨论"要不要换"就变成了"你还在等什么"。

什么是 Polars

Polars 是一个开源的 DataFrame 库,用于高速数据操作和分析。它的核心引擎用 Rust 编写,基于 Apache Arrow 内存模型,天生支持多线程并行计算。

一句话定位:DataFrames for the new era——新时代的 DataFrame 库。

它不是数据库,也不是查询引擎,而是 pandas 的替代品。你用它做数据清洗、转换、聚合、连接——所有你在 pandas 里干的事,但快一个数量级。

Polars 由荷兰开发者 Ritchie Vink 在 2020 年创建,MIT 协议开源。项目从 2020 年 8 月第一次提交到 2026 年 8 月,累计 15169 次提交、570 个版本标签,核心贡献者 96 人,是 Rust 生态最活跃的项目之一。

核心架构

Polars 的性能不是魔法,而是四根支柱撑起来的:

  • Rust 核心引擎:从零用 Rust 编写,无外部 C 依赖。Rust 的零成本抽象和内存安全让引擎既能跑得快,又不会出段错误
  • Apache Arrow 内存模型:数据在内存中以 Arrow 格式存储,与其他工具(Pandas、DuckDB、Spark)可以零拷贝共享数据
  • 多线程并行:自动利用所有 CPU 核心做并行计算,不需要你手动开线程
  • 惰性求值(Lazy Evaluation):这是 Polars 最硬核的设计——下面专门讲

惰性求值:Polars 的杀手锏

pandas 的工作方式是即时执行(Eager):你写一行代码,它立刻执行。比如先 filter 再 select,pandas 会先把整个表过滤一遍,再从结果中选列。

Polars 的 LazyFrame 不一样。它先把你所有的操作记录成一个查询图(Query Graph),等你说"执行"时,优化器整体看一遍,做以下事情:

  • 谓词下推(Predicate Pushdown):把 filter 操作推到最底层,先过滤再读取,少读数据
  • 投影下推(Projection Pushdown):只读取需要的列,不用整张表
  • 公共子表达式消除:多个操作用到同样的中间结果,只算一次
  • 并行化:独立操作自动并行执行

举个直观的例子:10 列 1000 万行的表,你只查 2 列做过滤。pandas 先把 1000 万行全读进来,再过滤。Polars Lazy 直接跳过其他 8 列,只读 2 列,过滤后返回。速度快 5 倍以上不夸张。

Polars 的核心特点

  • 极致性能:在独立 TPC-H 基准测试中,比 pandas 快 30-94 倍,与 DuckDB 处于同一梯队
  • 惰性求值 + 查询优化器:自动重排、下推、并行化你的操作
  • 多线程并行:自动利用全部 CPU 核心,无需配置
  • Apache Arrow 原生:与其他 Arrow 工具零拷贝互操作
  • Out-of-Core 流式引擎:数据比内存大也能处理,自动溢写到磁盘
  • 丰富的数据格式支持:CSV、JSON、Parquet、Avro、Delta Lake、Excel、IPC/Feather
  • 数据库连接:MySQL、PostgreSQL、SQL Server、SQLite、Redshift、Oracle
  • 云存储:S3、Azure Blob、Azure File
  • 多语言 API:Python(主力)、Rust、JavaScript/Node.js
  • Polars Cloud:同一套 API,无缝扩展到云端,零代码改动
  • GPU 支持:GPU 引擎已进入 Open Beta 阶段
  • 开源免费:MIT 协议,永远开源

谁在用 Polars

Optiver —— 量化交易,速度即金钱

Optiver 是全球顶级高频交易公司。他们的量化研究员 Matt Whitehead 说:"Polars 彻底改变了我的数据分析,完全替代了 pandas。它能轻松处理数百万行的 DataFrame,让我们专注于写更简洁的代码。速度?Polars 不只是快——是闪电般快。"

对高频交易来说,每一毫秒都意味着真金白银。Polars 的并行引擎让模型迭代时间大幅缩短,直接转化为交易决策优势。

Thoughtworks —— 技术雷达收录

全球顶级技术咨询公司 Thoughtworks 在其 Technology Radar 中将 Polars 评为"值得采用的框架",明确指出它比 pandas 更适合多线程和惰性执行场景。

全行业渗透

Polars 的采用已不限于金融。互联网、制造、医疗、零售——任何需要处理中大规模结构化数据的团队,都在从 pandas 迁移过来。GitHub 上 85k Star 的量级,说明这已经不是小众工具。

一个数据工具的采用曲线:先是量化交易公司(他们最在乎速度),然后是大厂数据团队,最后是所有用 Python 处理数据的人。Polars 正在走完这条曲线。

性能基准:用数据说话

Polars 官方维护了一套基于 TPC-H 的 PDS-H 基准测试(2025 年 5 月更新),在 AWS c7a.24xlarge(96 vCPU / 192GB)上跑:

Scale Factor 10(约 10GB 数据)

引擎总耗时(秒)倍数
Polars(流式)1.303.891.0
DuckDB 1.35.871.5x
Polars(内存)1.309.682.5x
Dask 2025.546.0211.8x
PySpark 4.0120.1130.9x
pandas 2.2.3365.7194.0x

pandas 比 Polars 慢了 94 倍。这不是微优化,是代际差距。

Scale Factor 100(约 100GB 数据)

引擎总耗时(秒)倍数
DuckDB 1.319.651.0
Polars(流式)1.3023.941.2x
Polars(内存)1.30152.277.7x
PySpark 4.0312.4315.9x
Dask 2025.5548.5227.9x

在 100GB 规模下,Polars 流式引擎与 DuckDB 性能接近,远超 PySpark 和 Dask。pandas 在这个规模直接 OOM 没法跑。

注意 Polars 内存引擎和流式引擎的差距:100GB 数据上,流式引擎快 6 倍。原因是大内存模式下 CPU 缓存命中率下降。流式引擎通过分批处理避免了这个问题。官方建议通过 pl.Config.set_engine_affinity(engine="streaming") 开启流式引擎。

初体验:5 分钟上手

安装就一行:

bash
pip install polars

来个实际例子——读取 CSV、过滤、聚合:

python
import polars as pl

# 读取 CSV(自动推断类型,比 pandas 快 10 倍以上)
df = pl.read_csv("sales.csv")

# Eager API:和 pandas 写法很像,但快得多
result = (
    df.filter(pl.col("amount") > 100)        # 过滤
      .group_by("region")                     # 分组
      .agg(pl.sum("amount").alias("total"))  # 聚合
      .sort("total", descending=True)         # 排序
)

print(result)

想释放全部性能?切到 Lazy 模式:

python
# scan_csv 代替 read_csv —— 惰性读取,不立即加载全量数据
lf = pl.scan_csv("sales.csv")

result = (
    lf.filter(pl.col("amount") > 100)
      .group_by("region")
      .agg(pl.sum("amount").alias("total"))
      .sort("total", descending=True)
      .collect()  # 此时才真正执行,优化器全权负责
)

print(result)

scan_csvread_csv 的区别:前者只记录"要读这个文件"的意图,不立即读取。等 collect() 时,优化器发现你只要 2 列,就只读 2 列。文件有 50 列你只用了 3 列?省掉 94% 的 I/O。

处理比内存大的数据也没问题:

python
# 开启流式引擎,处理超内存数据
pl.Config.set_engine_affinity(engine="streaming")

lf = pl.scan_parquet("huge_dataset.parquet")  # 200GB 文件,16GB 内存
result = (
    lf.filter(pl.col("date") >= pl.date(2026, 1, 1))
      .group_by("category")
      .agg([pl.sum("revenue"), pl.mean("cost")])
      .collect(streaming=True)  # 流式执行,自动溢写
)

Polars vs pandas:该不该换

维度pandasPolars
性能单线程,10GB 数据 365 秒多线程+惰性,10GB 数据 3.9 秒
内存数据翻倍膨胀Arrow 原生,零拷贝
大文件超内存就 OOM流式引擎自动溢写
API生态成熟,但设计混乱表达式 API,一致且可组合
并行需手写多线程自动并行
生态老牌,教程多增长最快,85k Star
语言C/CythonRust

如果你处理的数据不到 1GB、只是做个简单图表,pandas 没问题。但一旦数据量上 GB、要做复杂操作、或者在生产环境跑——Polars 是更优解。

进阶

Polars 不只是"更快的 pandas"。它的惰性求值、查询优化器、流式引擎、Arrow 原生设计,代表的是数据处理从"逐行执行"到"整体优化"的范式转变。2026 年它已经 85k Star,Python Polars 1.43.x 版本 API 彻底稳定,GPU 支持进入 Open Beta——它不再是实验性工具,而是生产就绪的数据处理标准。

如果你天天和 CSV、Parquet、数据分析打交道,Polars 值得一试。你的 CPU 和内存都会感谢你。

更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。

遇码MeetCoding 开源技术社区