提交新活动

谢谢!您的提交已收到!
糟糕!提交表单时发生错误。

提交新闻报道

谢谢!您的提交已收到!
糟糕!提交表单时发生错误。

订阅时事通讯

谢谢!您的提交已收到!
糟糕!提交表单时发生错误。
2018年8月28日

Pandas、Dask、Spark和Arrow的高层性能比较

作者

这项工作由Anaconda Inc支持

问题

Dask数据帧的性能与Pandas相比如何?Spark数据帧和Arrow又如何?它们之间有什么区别?

我每隔几周就会收到这个问题。写这篇文章是为了避免重复。

注意事项

  1. 这个答案可能会随时间而变化。我是在2018年8月写的。
  2. 这个问题和答案都非常高层。更技术性的答案是可能的,但此处不包含。

答案

Pandas

如果你来自Python并且数据集较小,那么Pandas是正确的选择。它易于使用,广泛理解,高效且维护良好。

并行处理的优势

使用像Dask数据帧或Spark数据帧这样的并行数据帧相比Pandas的性能优势(或劣势)会根据你进行的计算类型而有所不同

  1. 如果你进行的是小型计算,那么Pandas始终是正确的选择。并行化的管理成本将超过任何益处。如果你的计算时间少于例如100毫秒,则不应进行并行化。
  2. 对于过滤、清理和聚合大型数据等简单操作,使用并行数据帧应该会带来线性加速。
  3. 如果你在20核计算机上,你可能会期望20倍的加速。如果你在1000核集群上,你可能会期望1000倍的加速,前提是你的问题足够大,可以分散到1000个核心上。随着规模的扩大,管理开销会增加,因此你应预计加速会稍微降低。
  4. 对于分布式连接等复杂操作,情况更复杂。你可能会获得像上面那样的线性加速,或者甚至可能出现减速。有数据库类计算和并行计算经验的人可能能很好地预测哪些计算会表现良好。

然而,可能需要配置。人们经常发现并行解决方案在首次尝试时未能达到预期。不幸的是,大多数分布式系统都需要一些配置才能实现最佳性能。

还有其他加速Pandas的方法

许多希望加速Pandas的人并不需要并行处理。通常还有其他一些技巧,例如编码文本数据、使用高效的文件格式、避免使用groupby.apply等,这些方法在加速Pandas方面比转向并行处理更有效。

比较Apache Spark和Dask

假设是的,我确实想要并行处理,那么我应该选择Apache Spark还是Dask数据帧?

这通常更多是由文化偏好(JVM vs Python,一体化工具 vs 与其他工具集成)而不是性能差异决定的,但我将在此处尝试概述几点

  • 当你有大型SQL风格查询(例如100行以上的查询),Spark数据帧会更好,因为其查询优化器可以发挥作用。
  • 当查询超出典型数据库查询范围时,Dask数据帧会更好。这通常发生在时间序列、随机访问和其他复杂计算中。
  • Spark能更好地与JVM和数据工程技术集成。Spark也自带所有预打包的东西。Spark有自己的生态系统。
  • Dask能更好地与Python代码集成。Dask旨在与其他库和现有系统集成。如果你来自现有的基于Pandas的工作流程,通常更容易转向Dask。

总的来说,对于大多数操作,使用其中任何一个都没问题。人们通常基于文化偏好在Pandas/Dask和Spark之间进行选择。他们要么有真正喜欢Python生态系统的人,要么有真正喜欢Spark生态系统的人。

数据帧也只是每个项目的一小部分。Spark和Dask都做了很多不是数据帧的工作。例如,Spark有一个图分析库,Dask没有。Dask支持多维数组,Spark不支持。Spark通常更高层、一体化,而Dask更底层,专注于集成到其他工具中。

更多信息,请参阅Dask的“与Spark的比较文档”

Apache Arrow

Arrow怎么样?Arrow比Pandas快吗?

这个问题目前还不太有意义... 尚不

Arrow不是Pandas的替代品。今天,Arrow对构建系统的人有用,而不是直接对像Pandas那样的分析师有用。Arrow用于在不同的计算系统和文件格式之间移动数据。Arrow今天不做计算,但通常作为其他进行计算的库中的组件使用。例如,如果你今天使用Pandas、Spark或Dask,你可能正在使用Arrow而不知道。今天,Arrow对其他库更有用,而不是对最终用户。

然而,这种情况将来可能会改变。Arrow开发者计划围绕Arrow编写计算代码,我们预计这些代码会比Pandas或Spark中的代码更快。不过,这可能还需要一到两年。可能会有一些努力使其与Pandas半兼容,但这现在还为时过早。