-1

我对 dplyr 和 data.table 在我的 data.frame 上创建一个新变量并决定比较方法所花费的时间不满意。

令我惊讶的是,将 dplyr::mutate() 的结果重新分配给新的 data.frame 似乎比不这样做要快。

为什么会这样?

library(data.table)
library(tidyverse)


dt <- fread(".... data.csv") #load 200MB datafile

dt1 <- copy(dt)
dt2 <- copy(dt)
dt3 <- copy(dt)

a <- Sys.time()
dt1[, MONTH := month(as.Date(DATE))]
b <- Sys.time(); datatabletook <- b-a

c <- Sys.time()
dt_dplyr <- dt2 %>%
  mutate(MONTH = month(as.Date(DATE)))
d <- Sys.time(); dplyr_reassign_took <- d - c 

e <- Sys.time()
dt3 %>%
  mutate(MONTH = month(as.Date(DATE)))
f <- Sys.time(); dplyrtook <- f - e

datatabletook        = 17sec
dplyrtook            = 47sec
dplyr_reassign_took  = 17sec
4

1 回答 1

3

有几种方法可以使用 base R 进行基准测试

.t0 <- Sys.time()
    ...
.t1 <- Sys.time()
.t1 - t0    

 # or

 system.time({
     ...
 })

通过这种Sys.time方式,您将每一行发送到控制台,并且可能会看到为每一行打印的一些返回值,正如@Axeman 所建议的那样。使用{...}时,只有一个返回值(大括号内的最后一个结果)system.time并将禁止打印。

如果打印成本足够高,但不是您想要测量的一部分,它可以有所作为。


有充分的理由更喜欢system.time基准Sys.time测试;来自@MattDowle 的评论:

i) 它首先从时序中排除 gc 以从随机 gc 中分离出来,并且

ii) 它包括时间和user挂钟时间。syselapsed

Sys.time()在测试运行时在 Chrome 中阅读您的电子邮件或使用 Excel 会影响该方式,只要您使用结果的 和 部分,该方式system.time()就不会user受到sys影响。

于 2017-02-16T21:09:38.663 回答