Pandas vs Polar 性能比较


Pandas 是最著名的用于处理结构化数据的 Python 库。从科学家的一次性分析到完整的生产数据管道,它可以在任何地方使用,以实现数据清理、操作和分析的自动化。它的流行可以归因于它的易用性以及它建立在 Python 之上的事实,Python 是最流行的编程语言之一,学习曲线相对较低。

随着 Pandas 如此受欢迎,替代品在各地涌现也就不足为奇了。其中一个更有趣的是Polars。它旨在成为任何有 Pandas 经验的人都熟悉的库,但由于构建在 Rust 和 Apache Arrow2 之上,它提供了更好的性能。这也意味着它与 Arrow 生态系统中的其他工具兼容,可能对企业用户感兴趣。它可以作为 Python 和 Rust 中的库使用。

本博客的目标是查看一些真实世界的用例,看看哪个库表现更好。使用的 Pandas 版本是1.4.2Python 版本3.9.12。对于 Polars,选择了 Rust 版本而不是 Python 版本以获得最佳性能。特别是版本0.22.8和 Rustc 版本1.62.0。毕竟,在决定在数据管道或大数据分析中使用什么时,性能就是您想要的。

测试期间使用的数据集是来自 Kaggle 的New York City Taxi Trip Duration集的修改版本,最初包含 1.462.644 行。为了模拟一个大型数据集,它被复制了 25 次,因此它由 36.566.100 行组成。这个最终文件的大小约为 5GB。

硬件
测试在具有以下相关规格的 2015 型号 MacBook Pro 上运行:

  • 3,1 GHz 双核 Intel Core i7
  • 8 GB 1867 MHz DDR3

所有测试时间是 3 次连续运行的平均值。

......

结论
我们已经研究了六个不同的用例,其复杂性各不相同。每个人都清楚地表明,Polars 比 Pandas 的性能要好得多。但这当然不是全部。
代码复杂度

虽然使用 Polars 与使用 Pandas 非常相似,但有很多功能以相同的方式工作,代码几乎从来没有像在 Pandas 中那样简单。这当然与我们在示例中使用 Rust 的事实有关,它只需要更多代码来正确处理变量所有权等事情。

这确实带来了使您的代码更健壮的额外好处:大多数错误是在构建时捕获的,而不是在可能已经在生产中的运行时捕获的。
因此,在选择任何一个之前,都应该考虑对库的熟悉程度。

Pandas 加速
正如一些读者可能已经注意到的那样,Pandas 示例大多使用专注于易用性而非性能的内置函数。有很多方法可以让 Pandas 更接近(甚至可能超过?)Polars。您可以使用 Dask 并行化查询执行,使用内置to_numpy()函数将 DataFrame 转换为 int64 NumPy 对象,甚至直接使用 Cython。

虽然有很多选择,但现实情况是,通常在使用标准功能构建某些东西时,没有太多回头看的动力。

这就是 Polars 的优点,您可以使用熟悉的功能,但从一开始就获得性能,而无需诉诸技巧。

虽然 Polars 的性能更高,但挑选一个并不是那么简单。如果您定期处理大量数据,例如传感器数据、持续研究数据或财务数据,那么可能值得研究 Polars 以提高数据管道的有效性。尤其是在企业环境中,程序的运行时间可以从字面上转化为节省的资金。通常是由于所需的云资源较少。

另一方面,如果您需要一次性脚本来分析数据集以便继续执行其他任务,那么学习如何使用 Polars 可能不值得。特别是在科学界,很多分析只进行一次或两次 Pandas 是一个很好的工具。