使用 Polars 代替 Pandas:性能深入探究

在本文中,我们使用真实问题探讨了三个真实数据问题,其中 Polars 在每个指标上都超过了 Pandas。

来源:KDnuggets

简介

在过去的十年中,Pandas 一直是 Python 数据工作的基础。对于适合内存的数据集,它速度很快且足够熟悉,因此任何程序员都很少考虑切换库。

然而,一旦开始处理数百万行,缺陷就开始出现:需要几秒钟的 groupby 操作、消耗 RAM 的中间副本以及作为 Python 级循环而不是矢量化 C 或 Rust 代码运行的窗口函数。

Polars 是一个在 Apache Arrow 之上用 Rust 构建的 DataFrame 库。它的设计将并行性和惰性求值作为一流的功能。 Pandas 预先按顺序执行每个操作,而 Polars 可以构建查询计划并在执行之前对其进行优化,大多数操作会自动在所有可用的 CPU 核心上同时执行。

在本文中,我们使用 StrataScratch 编码平台中的真实问题探索三个真实数据问题。对于每个问题,我们都会比较两个库的解决方案,并指出性能差异最重要的地方。

使用rank() 与with_row_count():活动排名

在此问题中,目标是根据发送的电子邮件总数查找每个用户的电子邮件活动排名。拥有最多电子邮件的用户排名 1。结果必须按电子邮件总数降序排序,使用字母顺序作为决胜局,并且每个排名必须不同,即使两个用户的电子邮件数量相同。

数据视图

google_gmail_emails 表为每封发送的电子邮件存储一行,其中包含发件人 ID (from_user)、收件人 ID (to_user) 以及电子邮件的发送日期。这是表格的预览:

Grain(一个输出行的含义):一个用户,其电子邮件总数和唯一活动排名。

常见错误

解决方案

1. Pandas 解决方案

我们将 from_user 重命名为 user_id,按用户分组,计算电子邮件数量,计算第一排名,并按电子邮件数量降序排序,并按字母顺序进行平局。

2. Polars 解决方案

性能比较

边缘情况