默认返回system.time

时间:2012-12-01 17:45:19

标签: r

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

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

谢谢。

2 个答案:

答案 0 :(得分: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之类的东西。

您可能想知道每个顶级操作的时序对代码整体速度的影响。好吧,用microbenchmark很容易回答;)

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

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

答案 1 :(得分:0)

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

这里只是一点点味道:

&#34;要了解效果,请使用分析器。有许多不同类型的剖析器。 R使用一种相当简单的类型,称为采样或统计分析器。采样分析器每隔几毫秒停止执行一次代码,并记录当前正在执行的函数(以及调用该函数的函数,等等)。例如,考虑下面的f():&#34;

library(lineprof)
f <- function() {
  pause(0.1)
  g()
  h()
}
g <- function() {
  pause(0.1)
  h()
}
h <- function() {
  pause(0.1)
}