定义
Polars 是一个开源的数据处理软件库, 用于操作结构化数据, 其数据结构核心是二维的 DataFrame, 即带有行、列标签且各列可以取不同数据类型的表格[1]。它由 Rust 语言编写, 底层采用 Apache Arrow 列式格式作为内存模型, 官方提供 Python、R、Node.js 三种语言接口, 并支持 SQL 方言查询[2]。该项目采用 MIT 许可证发布, 属于自由软件[4]。
Polars 的编程模型建立在两个概念之上: 上下文与表达式。上下文包括 select、with_columns、filter、group_by 等, 决定对表格做什么; 表达式则是可组合的计算描述, 决定对哪些列、以何种方式计算[5]。这种设计使查询在执行前可以被整体优化, 而不必逐步立即求值[6]。
原理
Polars 的性能基础在于列式内存布局。数据按列连续存放, 同一列的取值类型一致, 便于压缩和向量化处理; 查询只需读取涉及到的列, 从而减少内存访问与磁盘输入输出[6]。Polars 使用自家实现的 Arrow 计算与缓冲区代码, 并非构建在 PyArrow 之上, 但可以消费和产生 Arrow 数据, 且常以零拷贝方式完成[1]。
在执行层面, Polars 同时提供即时求值与惰性求值两种模式。惰性模式下, 操作先被记录为逻辑计划, 由查询优化器改写后才真正执行, 常见优化包括谓词下推、投影下推与联接重排序[6]。执行器默认把所有可用 CPU 核心纳入并行计算, 无需用户显式配置[1]。
对于超出内存的数据集, 流式 API 允许分块处理, 不必将全部数据同时载入内存; 在惰性查询上调用 collect 时可指定流式引擎[7]。此外还存在可选的 GPU 支持, 可在英伟达显卡上运行查询[1]。Polars 的 DataFrame 设计为不可变, 过滤、加列等操作返回新的对象而非就地修改[8]。
查询计划的执行可概括为以下流程:
$\text{数据源} \rightarrow \text{扫描/读取} \rightarrow \text{表达式计算} \rightarrow \text{优化} \rightarrow \text{并行执行} \rightarrow \text{结果}$
graph LR
A[数据源: CSV Parquet 云存储 数据库] --> B[惰性扫描 scan_*]
B --> C[逻辑计划: 选择 过滤 分组 联接]
C --> D[查询优化器: 谓词下推 投影下推]
D --> E[并行与流式执行引擎]
E --> F[DataFrame 结果]
发展历程
Polars 的首次代码提交发生于 2020 年 6 月 23 日[2]。项目最初是 Ritchie Vink 的个人项目, 他因不满 pandas 在大数据量下的表现, 希望用 Rust 写一个更高效的数据处理库[9]。早期版本以即时 API 为主, 随后引入了类似 Spark 的惰性 API, 并将 Python 绑定模块从 pypolars 更名为 polars[10]。
2023 年 8 月, Polars 宣布获得由贝恩资本风险投资领投的约 400 万美元种子轮融资, 公司由 Ritchie Vink 与曾在 Xomnia 任首席技术官的 Chiel Peters 共同创立, 总部位于阿姆斯特丹[11]。2024 年 7 月 1 日, Python 版 Polars 发布 1.0 版本, 官方称其内存引擎与 API 已达到生产可用状态[3]。
2025 年 9 月, 公司完成由 Accel 领投、贝恩资本参与的 1800 万欧元 A 轮融资, 并推出云端产品 Polars Cloud 与分布式引擎 Polars Distributed; 当时官方披露月下载量已超过 2400 万次。项目在发布 1.0 后仍保持较高的发版频率, 同时开始区分稳定 API 与可能变动的非稳定 API[4]。
应用
Polars 主要用于单机上的数据分析与工程化数据处理, 典型场景包括读取大规模 CSV 或 Parquet 文件、执行筛选与聚合、以及构建 ETL 流水线[6]。在特征工程阶段, 它常被用来在训练模型前完成数据清洗与转换, 之后再把结果传给以数组或 pandas 为输入的下游机器学习库[6]。
在数据格式方面, Polars 对 CSV、Parquet、JSON、Arrow IPC 等文件格式以及本地、云存储和数据库等数据层提供支持, 扫描函数会返回惰性对象并把优化下推到读取环节[12]。它也能与同样基于 Arrow 的工具交换数据, 例如 DuckDB 可以直接查询 Polars 的 DataFrame 而无需复制数据[13]。除 Python 外, 使用者也可以直接在 Rust 项目中以 crate 形式引入, 或用 PyO3 编写自定义函数扩展其能力[7]。
局限
Polars 的生态规模小于 pandas。多数机器学习库、统计库和绘图库默认接收 pandas 的 DataFrame 或 NumPy 数组, 在 Polars 与这些工具衔接时通常需要显式转换, 而且这种转换不保证零拷贝[6]。在文件格式上, Polars 不原生支持 Excel 等格式, 需要先转换为受支持的格式[13]。
Polars 只面向单机纵向扩展, 并不是分布式计算框架; 它的定位是充分利用一台机器的全部资源, 而不是跨集群调度[14]。流式执行也并非适用于所有操作: 需要跨批次上下文或必须物化中间结果的计算, 仍可能占用可观的显存或内存[15]。
在 API 习惯上, Polars 不设行索引, 强制在查询前确定数据类型, 并且不鼓励逐行处理, 因此从 pandas 迁移存在学习成本[13]。惰性优化虽然能提升吞吐, 但对规模很小的任务而言, 查询计划的构建本身会带来额外开销; 多线程默认开启, 在生产环境中也需要通过环境配置加以控制[6]。
参见
参考资料
- Blazingly Fast DataFrame Library [引用日期2026-10-14]
- Polars (software) [引用日期2026-10-14]
- Announcing Polars 1.0 [引用日期2026-10-14]
- githubusercontent.com 上的网页 [引用日期2026-10-14]
- Getting started [引用日期2026-10-14]
- Polars vs Pandas [引用日期2026-10-14]
- Polars [引用日期2026-10-14]
- theneuralbase.com 上的网页 [引用日期2026-10-14]
- Polars – Wikipedie [引用日期2026-10-14]
- polars - No project description provided [引用日期2026-10-14]
- businesswire.com 上的网页 [引用日期2026-10-14]
- CSV - Polars user guide [引用日期2026-10-14]
- polars-vs-pandas [引用日期2026-10-14]
- jetbrains.com 上的网页 [引用日期2026-10-14]
- DuckDB vs. Polars vs. Pandas: Benchmark & Comparison [引用日期2026-10-14]