看起来 Wes 可能在data.table
唯一字符串 ( levels ) 的数量很大时发现了一个已知问题:10,000。
是否Rprof()
显示大部分时间都在通话中sortedmatch(levels(i[[lc]]), levels(x[[rc]])
?这并不是真正的连接本身(算法),而是一个初步步骤。
最近的努力已经进入允许键中的字符列,这应该通过与 R 自己的全局字符串哈希表更紧密地集成来解决这个问题。一些基准测试结果已被报告,test.data.table()
但该代码尚未连接以将级别替换为级别匹配。
pandas 的合并速度是否比data.table
常规整数列快?这应该是一种隔离算法本身与因素问题的方法。
此外,data.table
考虑时间序列合并。两个方面:i) 多列有序键,例如 (id,datetime) ii) 快速流行的连接 ( roll=TRUE
),也就是最后的观察结果。
我需要一些时间来确认,因为这是我第一次看到与data.table
所呈现的比较。
2012 年 7 月发布的 data.table v1.8.0 的更新
- 当将 i 级别匹配到“因子”类型的列的 x 级别时,内部函数 sortedmatch() 被删除并替换为 chmatch()。当因子列的水平数很大(例如>10,000)时,这个初步步骤会导致(已知的)显着放缓。正如 Wes McKinney(Python 包 Pandas 的作者)所证明的那样,在加入四个这样的列的测试中加剧了这种情况。例如,匹配 100 万个字符串,其中 600,000 个是唯一的,现在从 16 秒减少到 0.5 秒。
在那个版本中还有:
现在允许在键中使用字符列,并且优先考虑因素。data.table() 和 setkey() 不再强制字符为因子。因素仍然得到支持。实现 FR#1493、FR#1224 和(部分)FR#951。
新函数 chmatch() 和 %chin%,match() 和 %in% 用于字符向量的更快版本。使用了 R 的内部字符串缓存(没有构建哈希表)。它们比 ?chmatch 中的示例中的 match() 快约 4 倍。
截至 2013 年 9 月,data.table 在 CRAN 上是 v1.8.10,我们正在开发 v1.9.0。新闻实时更新。
但正如我最初写的那样,上面:
data.table
考虑到时间序列合并。两个方面:i) 多列有序键,例如 (id,datetime) ii) 快速流行的连接 ( roll=TRUE
),也就是最后的观察结果。
因此,两个字符列的 Pandas equi join 可能仍然比 data.table 快。因为它听起来像是对合并的两列进行哈希处理。data.table 不会散列密钥,因为它考虑了普遍的有序连接。data.table 中的“键”实际上只是排序顺序(类似于 SQL 中的聚集索引;即,这就是数据在 RAM 中的排序方式)。例如,在列表中添加辅助键。
总之,这个具有超过 10,000 个唯一字符串的特殊两字符列测试突出显示的明显速度差异现在应该不会那么糟糕,因为已知问题已得到修复。