5

我必须对大数据集进行广泛的数据操作(主要使用 data.table、RStudio)。我想监控每个步骤的运行时间,而不需要在每个步骤上显式调用 system.time() 。

默认情况下,是否有一个包或简单的方法来显示每个步骤的运行时间?

谢谢你。

4

2 回答 2

5

这不完全是您所要求的,但我已经编写了time_file(https://gist.github.com/4183595),它source()是一个 R 文件,并运行代码,然后重写文件,插入包含每个多长时间的注释顶级语句开始运行。

time_file()变成这样:

{
  load_all("~/documents/plyr/plyr")
  load_all("~/documents/plyr/dplyr")
  library(data.table)
  data("baseball", package = "plyr")
  vars <- list(n = quote(length(id)), m = quote(n + 1))
}

# Baseline case: use ddply
a <- ddply(baseball, "id", summarise, n = length(id))

# New summary method: ~20x faster
b <- summarise_by(baseball, group("id"), vars)

# But still not as fast as specialised count, which is basically id + tabulate
# so maybe able to eke out a little more with a C loop ?
count(baseball, "id")

进入这个:

{
  load_all("~/documents/plyr/plyr")
  load_all("~/documents/plyr/dplyr")
  library(data.table)
  data("baseball", package = "plyr")
  vars <- list(n = quote(length(id)), m = quote(n + 1))
}

# Baseline case: use ddply
a <- ddply(baseball, "id", summarise, n = length(id))
#:    user  system elapsed
#:   0.451   0.003   0.453

# New summary method: ~20x faster
b <- summarise_by(baseball, group("id"), vars)
#:    user  system elapsed
#:   0.029   0.000   0.029

# But still not as fast as specialised count, which is basically id + tabulate
# so maybe able to eke out a little more with a C loop ?
count(baseball, "id")
#:    user  system elapsed
#:   0.008   0.000   0.008

它不会对顶级{块内的代码进行计时,因此您可以选择不对您不感兴趣的内容进行计时。

我认为无论如何都不会自动将计时添加为顶级效果,而无需以某种方式修改您运行代码的方式 - 即使用类似time_file而不是source.

您可能想知道每个顶级操作的计时对代码的整体速度有何影响。嗯,这很容易用微基准来回答;)

library(microbenchmark)
microbenchmark(
  runif(1e4), 
  system.time(runif(1e4)),
  system.time(runif(1e4), gc = FALSE)
)

因此,时间增加的开销相对较小(我的计算机上为 20µs),但默认的 gc 每次调用增加了大约 27 ms。因此,除非您有数千个顶级调用,否则您不太可能看到太大的影响。

于 2012-12-01T18:02:15.783 回答
0

对于这个额外的答案,我必须完全归功于@jbecker的IRC 频道,但对我来说,解决方案在这里: http ://adv-r.had.co.nz/Profiling.htmlFreenode#R

这里只是一点点的味道:

“要了解性能,您可以使用分析器。有许多不同类型的分析器。R 使用一种相当简单的类型,称为采样或统计分析器。采样分析器每隔几毫秒就会停止执行代码并记录当前正在执行的函数执行(以及调用该函数的函数,等等)。例如,考虑下面的 f():"

library(lineprof)
f <- function() {
  pause(0.1)
  g()
  h()
}
g <- function() {
  pause(0.1)
  h()
}
h <- function() {
  pause(0.1)
}
于 2014-08-19T15:03:36.030 回答