为什么pandas在python合并比data.table合并R?

我最近遇到了python的pandas库,根据这个基准testingperformance出非常快的内存合并。 它甚至比R中的data.table包(我select分析的语言)更快。

为什么pandasdata.table ? 是因为python比R有一个固有的速度优势,还是有一些折衷,我不知道? 有没有办法在data.table执行内部和外部连接,而不是通过merge(X, Y, all=FALSE)merge(X, Y, all=TRUE)

对照

以下是用于对各种软件包进行基准testing的R代码和Python代码 。

看起来像Wes可能已经在data.table发现了一个已知的问题,当唯一string( 级别 )的数量很大时:10,000。

Rprof()是否显示了在调用sortedmatch(levels(i[[lc]]), levels(x[[rc]])中所花费的大部分时间?这不是真正的连接本身(algorithm),而是预备步骤。

最近的努力已经进入允许密钥中的字符列,这应该通过更密切地整合R自己的全局string哈希表来解决这个问题。 一些基准testing结果已经由test.data.table()报告过了,但是代码并没有被连接起来,而是将这些关卡replace为关卡匹配。

pandas比常规整数列的data.table更快吗? 这应该是隔离algorithm本身与因素问题的一种方法。

此外, data.table时间序列合并 。 两个方面:i)多列sorting的键,如(id,datetime)ii)快速stream行join( roll=TRUE ),也就是最后的观察结果。

我需要一些时间来确认,因为这是我所见过的与data.table比较的第一个。


从2012年7月发布的data.table v1.8.0更新

  • 内部函数sortedmatch()被移除,当匹配i水平到'factor'types列的x水平时用chmatch()replace。 当一个因子列的级数很大(例如> 10,000)时,这个初步步骤会导致(已知的)显着减速。 在Wes McKinney(Python包Pandas的作者)的演示中,join了四个这样的列的testing。 例如,匹配100万个string,其中60万个是唯一的,现在从16秒减less到0.5秒。

在那个版本中也是:

  • 字符列现在允许在键中,并且优选因子。 data.table()和setkey()不再强制字符因子。 因素仍然受支持。 实现FR#1493,FR#1224和(部分)FR#951。

  • 新函数chmatch()和%chin%,用于字符向量的更高版本的match()和%in%。 R的内部stringcaching被利用(不build立哈希表)。 他们比match()中的例子快4倍左右。

截至2013年9月,data.table在CRAN上是v1.8.10,我们正在开发v1.9.0。 新闻现场更新。


但正如我上面写的那样:

data.table时间序列合并 。 两个方面:i)多列sorting的键,如(id,datetime)ii)快速stream行join( roll=TRUE ),也就是最后的观察结果。

所以两个字符列的Pandas equi连接可能还是比data.table更快。 因为它听起来像是把两列合并在一起。 data.table不会散列关键字,因为它有stream行的有序连接。 data.table中的“键”实际上只是sorting顺序(类似于SQL中的聚簇索引,即数据在RAM中的sorting方式)。 例如,列表中添加了辅助键。

总而言之,由于已知的问题已经得到解决,现在这个具有超过10,000个独特string的特定双字符列testing强调的显着速度差异现在不应该那么糟糕。

大pandas更快的原因是因为我想出了一个更好的algorithm,使用快速哈希表实现-klib和C / Cython非常仔细地实现 ,以避免Python解释器开销不可vector化的部分。 这个algorithm在我的介绍中有详细的描述: 看pandas的devise和开发

data.table的比较实际上是有点有趣的,因为R的data.table的整个点是包含预先计算的各列的索引 ,以加速数据select和合并等操作。 在这种情况下(数据库连接)pandas的DataFrame中包含用于合并的预先计算的信息 ,可以说这是一个“冷”合并。 如果我已经存储了encryption密钥的分解版本,join会明显加快 – 因为分解是这个algorithm的最大瓶颈。

我还要补充一点,大pandas的DataFrame的内部devise比R的data.frame(这只是内部的数组列表)更适合于这些操作。

这个话题已经两年了,但是当他们寻找大pandas和data.table的比较的时候,这个话题似乎是一个可能的地方。

由于这两个都是随着时间的推移而发展的,我想在这里为感兴趣的用户发布一个相对较新的比较(从2014年开始): https : //github.com/Rdatatable/data.table/wiki/Benchmarks- : -Grouping

如果Wes和/或Matt(分别是Pandas和data.table的创build者,上面都有评论)有任何新消息要添加在这里,那么将会很有趣。

– 更新 –

下面由jangorecki发表的评论包含一个我认为非常有用的链接: https : //github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

该图描绘了不同技术的平均聚合和连接操作时间( 下=更快 ;比较最后更新于2016年9月)。 这对我来说真的很有教育意义。

回到这个问题, R DT keyR DT引用了R的data.table中的键/无键风格,并且在Python基准testing中比Python的Pandas( Py pandas )更快。