【发布时间】:2014-03-09 05:17:27
【问题描述】:
我真正喜欢data.table 的地方在于:= 通过引用更改表格的习语,无需昂贵的副本。据我了解,这是使data.table 与其他方法相比如此超快的方面之一。
现在,我开始使用dplyr 包,它似乎具有同样的性能。但是由于仍然必须使用<- 运算符分配结果,所以我预计在这个级别会消耗性能。不过好像没有。
举个例子:
library(dplyr)
library(Lahman)
library(microbenchmark)
library(ggplot2)
df <- Batting[ c("yearID", "teamID", "G_batting") ]
mb <- microbenchmark(
dplyr = {
tb <- tbl_df( df )
tb <- tb %.%
group_by( yearID, teamID ) %.%
mutate( G_batting = max(G_batting) )
},
data.table = {
dt <- as.data.table( df )
dt[ , G_batting := max(G_batting), by = list( yearID, teamID ) ]
},
times = 500
)
qplot( data = mb, x = expr, y = time * 1E-6, geom = "boxplot", ylab="time [ms]", xlab = "approach" )
我只是想知道这怎么可能?或者我的基准测试方式是否存在概念错误?难道我对<-的理解错了吗?
【问题讨论】:
-
并不是说这里一定是这种情况,但是使用
.CallC API 可以潜在地改变任何对象。 API 不强制开发人员返回一个新对象,并且传入的对象的所有数据都可以通过SEXP结构的 C 指针提供给开发人员。我自己已经完成了对图像数据的快速就地操作(不,这是不可取的!)。 -
不管它值多少钱,对我来说,
dplyr在你的基准测试的所有迭代中都比data.table慢 50%(在微基准测试上是 100 倍,尽管在早期的运行中我得到了更差的结果 @ 987654333@ 案例)。这是在 Windows 64 位机器上。 -
@BrodieG 很有趣。为完整起见,此基准测试是在 R 3.0.2、Mac (x86_64-apple-darwin10.8.0 (64-bit))、
dplyrversion 0.1.1 (2014-02-09) 和data.table上进行的1.8.10. -
我也在 3.0.2 / 0.1.1 / 1.8.10。数据表计时:
10.52806 10.91406 11.51819 11.91552 14.73834,Dplyr:15.69537 16.29676 16.71768 17.43426 24.86194(min、lq、med、uq、max、毫秒)。 -
数据集需要更大,复制需要更小。否则它是在比较开销,而不是任务本身。
标签: r data.table dplyr