pandas 现在比 data.table 快吗?

数据挖掘 Python r 熊猫 数据 数据表
2021-09-30 22:24:00

是最新data.table基准测试的 GitHub 链接。

自 2014 年以来,data.table基准测试一直没有更新。我听说某处Pandas现在比data.table. 这是真的?有人做过基准测试吗?我以前从未使用过 Python,但如果pandas可以击败,我会考虑切换data.table

4个回答

有人做过基准测试吗?

的,2014 年的基准已经变成了db-benchmark项目的基础。第一步是在最新版本的软件上重现 2014 年的基准,然后使其成为连续基准,因此它会定期运行并在每次运行前自动升级软件。随着时间的推移,添加了许多东西。下面是 2014 年基准测试与db-benchmark项目的高级差异。

新的:

  • 连续基准测试:定期运行、升级软件、重新运行基准测试脚本
  • 更多软件解决方案:spark、python datatable、cuda dataframes、julia dataframes、clickhouse、dask
  • 更多数据案例
    • 两个新的更小的数据大小:0.5GB(1e7 行)和 5GB(1e8 行)
    • 另外两个基数因素:不平衡,严重不平衡
    • 排序性
    • 数据不适用
  • 高级groupby问题
    • median,sd
    • 范围 v1-v2:max(v1)-min(v2)
    • 前 2 行:order(.); head(.,2)
    • 回归:cor(v1, v2)^2
    • count并按6列分组
  • 基准任务:join

更改(请参阅groupby20142014 完全兼容的基准脚本的任务):

我们计划在未来添加更多的软件解决方案和基准测试任务。非常欢迎提供反馈,欢迎访问我们的问题跟踪器https://github.com/h2oai/db-benchmark/issues


pandas 现在比 data.table 快吗?

根据我们的结果,pandas 并不比 data.table 快。

我正在粘贴中等大小的数据 5GB(1e8 行)groupby 基准图,该图取自h2oai.github.io/db-benchmark截至 20210312 的报告。请参阅h2oai.github.io/db-benchmark#explore-more-data-其他数据大小的案例(1e7、1e9)、数据案例(基数、NA、排序)、问题组(高级)或任务(连接)。

有关最新的时间安排,请访问https://h2oai.github.io/db-benchmark

groupby_1e8_1e2_0_0_basic

我和一位同事对 pandas 和 data.table 之间的性能差异进行了一些初步研究。您可以在我们的博客上找到该研究(分为两部分)(您可以在此处找到第二部分)。

我们发现在某些任务中,pandas 的性能明显优于 data.table,但也有一些情况下 data.table 的速度要快得多。您可以自己检查一下,让我们知道您对结果的看法。

编辑:
如果您不想详细阅读博客,这里是我们设置和发现的简短摘要:

设置

我们在以下操作(到目前为止)上比较了 12 个不同的模拟数据集,我们称之为场景pandasdata.table

  • 使用类似选择的操作进行数据检索
  • 使用条件选择操作进行数据过滤
  • 数据排序操作
  • 数据聚合操作

计算是在具有 4 个物理内核、16GB RAM 和 SSD 硬盘驱动器的 Intel i7 2.2GHz 机器上进行的。软件版本为 OS X 10.13.3、Python 3.6.4 和 R 3.4.2。pandas 分别使用的库版本为 0.22,data.table 使用的库版本为 1.10.4-3

结果简而言之

  • data.table选择列时似乎更快(pandas平均需要多 50% 的时间)
  • pandas过滤行更快(平均大约 50%)
  • data.table排序似乎要快得多(pandas有时慢 100 倍)
  • 添加新列的速度更快pandas
  • 聚合结果完全混合

请注意,我试图尽可能简化结果,以免让您感到厌烦。如需更完整的可视化,请阅读研究。如果您无法访问我们的网页,请给我留言,我会将我们的内容转发给您。您可以在GitHub上找到完整研究的代码如果您对如何改进我们的学习有任何想法,请给我们发送电子邮件。您可以在 GitHub 上找到我们的联系人。

不,事实上,如果数据集大小太大以至于 pandas 崩溃,你基本上就会被 dask 困住,这很糟糕,你甚至不能做一个简单的 groupby-sum。dplyr 可能不快,但它不会搞砸。

我目前正在研究一些小的 2G 数据集,并且一个简单print(df.groupby(['INCLEVEL1'])["r"].sum())的崩溃问题。

dplyr 没有遇到此错误。

所以,如果 pandas 可以处理数据集,我使用 pandas,如果没有,则坚持使用 R 数据表。

是的,您可以使用简单的方法将 dask 转换回 pandas 数据帧,df.compute() 但这需要相当长的时间,所以您不妨耐心等待 pandas 加载或读取数据表。

我知道这是一篇较旧的帖子,但认为它可能值得一提 - 使用羽毛(在 R 和 Python 中)允许对数据帧/数据表进行操作并通过羽毛共享这些结果。

见feather的github页面