熊猫现在比data.table快吗?


16

https://github.com/Rdatatable/data.table/wiki/Benchmarks-%3A-Grouping

自2014年以来,未对data.table基准进行更新。我听说某个地方Pandas现在的速度比快data.table。这是真的?有人做过基准测试吗?我以前从未使用过Python,但会考虑切换是否pandas可以击败data.table


7
那是切换到python的一个非常不好的理由。
马修·德鲁里

2
@MatthewDrury怎么样?数据及其操作是我工作的80%。只有20%用于拟合模型和表示。为什么不选择最快给我结果的方法?
xiaodai

2
python和R都是具有巨大生态系统和社区的既定语言。为了减少选择一个图书馆,是在一片广阔的森林中崇拜一棵树。即使这样,对于单个库来说,效率也只是众多问题中的唯一一个问题(接口的表现力如何,如何与其他库连接,代码库的可扩展性,开发人员的开放性)。我认为选择本身就是错误的二分法。这两个社区的重点不同,这赋予了语言不同的优势。
马修·德鲁里

3
您有一块适合进行20%工作的巨大森林?所以不要在80%的工作中做出选择?没有什么可以阻止我使用熊猫做数据准备,然后在R python或Julia中建模。我认为我的想法是正确的。如果熊猫比我快,应该选择它作为我的主要工具。
xiaodai

1
您可能会在感兴趣/使用的R中找到网状包装。同样,为使R在数据库中工作/发挥作用,已经付出了越来越多的努力(请参阅诸如dbplyr之类的努力)。
slackline

Answers:


15

有人做过基准测试吗?

是的,您在问题中链接的基准已针对data.table和pandas的最新版本进行了更新。此外,还添加了其他软件。您可以在https://h2oai.github.io/db-benchmark中找到更新的基准测试。
不幸的是,该基准测试计划在125GB内存计算机上进行(而不是原来的244GB)。结果,pandas和dask无法groupby对1e9行(50GB csv)数据进行尝试,因为它们在读取数据时会耗尽内存。因此,对于pandas vs data.table,您必须查看1e8行(5GB)数据。

不仅要链接您要的内容,我还要粘贴这些解决方案的最新时间。

请注意,这些时间已过时,
请访问https://h2oai.github.io/db-benchmark以获取更新的时间

| in_rows|question              | data.table| pandas|
|-------:|:---------------------|----------:|------:|
|   1e+07|sum v1 by id1         |      0.140|  0.414|
|   1e+07|sum v1 by id1:id2     |      0.411|  1.171|
|   1e+07|sum v1 mean v3 by id3 |      0.574|  1.327|
|   1e+07|mean v1:v3 by id4     |      0.252|  0.189|
|   1e+07|sum v1:v3 by id6      |      0.595|  0.893|
|   1e+08|sum v1 by id1         |      1.551|  4.091|
|   1e+08|sum v1 by id1:id2     |      4.200| 11.557|
|   1e+08|sum v1 mean v3 by id3 |     10.634| 24.590|
|   1e+08|mean v1:v3 by id4     |      2.683|  2.133|
|   1e+08|sum v1:v3 by id6      |      6.963| 16.451|
|   1e+09|sum v1 by id1         |     15.063|     NA|
|   1e+09|sum v1 by id1:id2     |     44.240|     NA|
|   1e+09|sum v1 mean v3 by id3 |    157.430|     NA|
|   1e+09|mean v1:v3 by id4     |     26.855|     NA|
|   1e+09|sum v1:v3 by id6      |    120.376|     NA|

在5个问题中,有4个问题的data.table速度更快,而且可以扩展。
只要注意这个时机是截至目前,其中id1id2id3是字符型字段。那些将很快更改为分类 完成。此外,还有其他因素可能会在不久的将来影响这些时间安排(例如,并行分组 DONE)。我们还将为具有NA完成的各种基数的 数据添加单独的基准。

此持续基准测试项目还有其他任务,因此,如果您对,和感兴趣join,请确保稍后进行检查。 当然,我们欢迎您在项目回购中提供反馈!sortread


1
那JuliaDB呢?
skan


1
好的答案-AFAICT您链接的基准都在同一VM上运行?也就是说,在相同条件下,pandas和dask需要超过128GB RAM才能容纳50GB的表,而其他服务器可以在此约束下执行吗?如果是这样的话,这也反映了我的经历,即熊猫在中等大小(〜10GB)的桌子上对许多普通日常物品而言RAM效率非常低,并且在大多数情况下,这是一个比执行速度大得多的问题。(距离更近,并且在任何情况下都要根据具体工作负载
来回权衡

@jkf是的,完全正确。机器的内存为128 GB,因为我们计划在500 GB数据集(10e9行)上测试内存处理。目前,只有spark和pydatatable支持该功能,并且很快就会添加到clickhouse中。
jangorecki

@jangorecki是一个非常有用的基准。非常感谢您的努力。我对不了解50GB数据集的快感感到困惑。DASK具有分区大小作为参数之一(例如blocksizeread_csv)。您是否尝试避免调用compute()并将输出转储到磁盘上,以避免在内存中组装整个输出表?
Mischa Lisovyi

13

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

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

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

设定

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

  • 通过类似选择操作进行数据检索
  • 使用条件选择操作进行数据过滤
  • 数据排序操作
  • 数据汇总操作

该计算是在装有Intel i7 2.2GHz,4个物理内核,16GB RAM和SSD硬盘的计算机上执行的。软件版本为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上找到我们的联系人。


1
正如您可能已经从我的答案中读到的那样,我已经说过结果参差不齐。请阐明我是否会更具体地回答我,可能会详细说明一些数字。
Tobias Krabel '18

1
“您对该网站的访问受到限制。” 我似乎无法通过手机或工作计算机访问该网站。
xiaodai '18

1
很抱歉阅读。我已经在手机上亲自检查过,没有任何问题。可能与您尝试联系的国家/地区有关?
Tobias Krabel

1
“ 4个物理核心” = 8个逻辑核心。它还有助于说明哪个特定的Intel i7 2.2GHz(哪个版本?哪个变体?-HQ?)以及什么缓存大小。对于SSD,读写速度如何?
smci

它们与Julia数据框和JuliaDB相比如何?
skan

3

不会,实际上,如果数据集大小太大而导致熊猫崩溃,那么您基本上会陷入困惑,这很烂,甚至无法进行简单的groupby-sum。dplyr可能并不快,但不会弄乱。

我目前正在处理一些2G数据集,并且很简单print(df.groupby(['INCLEVEL1'])["r"].sum())

dplyr没有遇到此错误。

因此,如果熊猫可以处理数据集,那么我将使用熊猫,如果不能使用,请坚持使用R数据表。

是的,您可以通过简单的方法将dask转换回pandas数据帧,df.compute() 但这需要花费相当长的时间,因此您最好耐心等待pandas加载或读取数据表。


1
不知道Dask太糟糕了。也许您想尝试R的disk.frame?github.com/xiaodaigh/disk.frame我是作者
xiaodai

1

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

参见feather的github页面


中大型数据集的段
故障
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.