---
url: /polars/introduction.md
description: Polars是什么？Rust写的DataFrame库，比pandas快30倍，85k Star，量化交易公司都在用，五分钟搞懂下一代数据分析引擎
---

# 认识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.30** | **3.89** | **1.0** |
| DuckDB 1.3 | 5.87 | 1.5x |
| Polars（内存）1.30 | 9.68 | 2.5x |
| Dask 2025.5 | 46.02 | 11.8x |
| PySpark 4.0 | 120.11 | 30.9x |
| pandas 2.2.3 | 365.71 | **94.0x** |

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

**Scale Factor 100（约 100GB 数据）**

| 引擎 | 总耗时（秒） | 倍数 |
|------|------------|------|
| DuckDB 1.3 | 19.65 | 1.0 |
| **Polars（流式）1.30** | **23.94** | **1.2x** |
| Polars（内存）1.30 | 152.27 | 7.7x |
| PySpark 4.0 | 312.43 | 15.9x |
| Dask 2025.5 | 548.52 | 27.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_csv` 和 `read_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：该不该换

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

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

## 进阶

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

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

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