【发布时间】:2016-06-26 06:54:55
【问题描述】:
我认为一般来说使用%>% 不会对速度产生明显影响。但在这种情况下,它的运行速度要慢 4 倍。
library(dplyr)
library(microbenchmark)
set.seed(0)
dummy_data <- dplyr::data_frame(
id=floor(runif(10000, 1, 10000))
, label=floor(runif(10000, 1, 4))
)
microbenchmark(dummy_data %>% group_by(id) %>% summarise(list(unique(label))))
microbenchmark(dummy_data %>% group_by(id) %>% summarise(label %>% unique %>% list))
没有管道:
min lq mean median uq max neval
1.691441 1.739436 1.841157 1.812778 1.880713 2.495853 100
带管道:
min lq mean median uq max neval
6.753999 6.969573 7.167802 7.052744 7.195204 8.833322 100
为什么%>% 在这种情况下会慢很多?有没有更好的写法?
编辑:
我使数据框更小,并将 Moody_Mudskipper 的建议纳入基准测试。
microbenchmark(
nopipe=dummy_data %>% group_by(id) %>% summarise(list(unique(label))),
magrittr=dummy_data %>% group_by(id) %>% summarise(label %>% unique %>% list),
magrittr2=dummy_data %>% group_by(id) %>% summarise_at('label', . %>% unique %>% list),
fastpipe=dummy_data %.% group_by(., id) %.% summarise(., label %.% unique(.) %.% list(.))
)
Unit: milliseconds
expr min lq mean median uq max neval
nopipe 59.91252 70.26554 78.10511 72.79398 79.29025 214.9245 100
magrittr 469.09573 525.80084 568.28918 558.05634 590.48409 767.4647 100
magrittr2 84.06716 95.20952 106.28494 100.32370 110.92373 241.1296 100
fastpipe 93.57549 103.36926 109.94614 107.55218 111.90049 162.7763 100
【问题讨论】:
-
你不应该离开单位。在这种情况下,您可能在谈论毫秒甚至微秒。
-
如果您要比较两个 sn-ps,请在同一
microbenchmark调用中运行它们:microbenchmark(code1 = { ...first snippet... }, code2 = { ...second snippet... })(或不带名称),以便您可以直接比较时间。跨度> -
所以,关于毫秒或微秒的评论完全不合时宜。请参阅下面的答案。
标签: r performance dplyr magrittr cardinality