测量函数在R中的执行时间

在R中是否有衡量函数执行时间的标准化方法?

显然,我可以在执行前后取system.time,然后取它们的差异,但我想知道是否有一些标准化的方法或函数(不希望发明轮子)。


我似乎记得我曾经用过如下的东西:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction
273689 次浏览

内置函数system.time()将完成此任务。

使用like: system.time(result <- myfunction(with, arguments))

度量执行时间的一个稍微更好的方法是使用rbenchmark包。这个包(很容易)允许您指定复制测试的次数,以及相对基准测试应该是多少次。

另请参见stats.stackexchange中的相关问题

如果你喜欢,你可以使用matlab风格的tic-toc函数。看另一个SO问题

秒表功能在R

正如Andrie所说,system.time()工作正常。对于简短的函数,我更喜欢把replicate()放在里面:

system.time( replicate(10000, myfunction(with,arguments) ) )

另一种可能的方法是使用Sys.time():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

与上面的答案相比,这不是最优雅的方法,但绝对是一种方法。

还有proc.time()

你可以以与Sys.time相同的方式使用,但它会给你一个与system.time相似的结果。

ptm <- proc.time()
#your function here
proc.time() - ptm

主要区别使用

system.time({ #your function here })

proc.time()方法仍然执行你的函数,而不仅仅是测量时间… 顺便说一下,我喜欢使用system.time{}在里面,这样你可以放一组东西…

包“tictoc”为您提供了一种非常简单的测量执行时间的方法。文档在:https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf中。

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

要保存经过的时间到一个变量,你可以这样做:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

虽然其他解决方案对于单个函数也很有用,但我推荐使用下面的代码段,因为它更通用、更有效:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

microbenchmark是一个轻量级(~50kB)包,或多或少是R中对多个表达式和函数进行基准测试的标准方法:

microbenchmark(myfunction(with,arguments))

例如:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
expr min lq    mean median uq   max neval cld
log10(5)   0  0 25.5738      0  1 10265 10000   a
log(5)/log(10)   0  0 28.1838      0  1 10265 10000

在这里,两个表达式都被计算了10000次,平均执行时间约为25-30纳秒。

另一种简单但非常强大的方法是使用包profvis。它不仅测量代码的执行时间,还为您提供了执行每个函数的钻取。它也可以用于Shiny。

library(profvis)


profvis({
#your code here
})

点击在这里查看一些例子。

你可以使用Sys.time()。然而,当你在表格或csv文件中记录时差时,你不能简单地说end - start。相反,你应该定义这个单位:

f_name <- function (args*){
start <- Sys.time()
""" You codes here """
end <- Sys.time()
total_time <- as.numeric (end - start, units = "mins") # or secs ...
}

然后你可以使用total_time,它有一个合适的格式。

基于板凳包网站:

bench中的bench::mark()用于对一个或一系列表达式进行基准测试,我们认为它比替代方法有许多优点。

  • 始终为每个操作系统使用最高精度的api(通常是纳秒级)。
  • 跟踪每个表达式的内存分配。
  • 跟踪每次表达式迭代的R垃圾收集的数量和类型。
  • 默认情况下验证表达式结果是否相等,以避免意外地对不相等的代码进行基准测试。
  • bench::press(),它允许你在一个大的值网格中轻松地执行和组合基准测试。
  • 默认情况下使用自适应停止,在一组时间内运行每个表达式,而不是在特定次数的迭代中运行。
  • 表达式是批量运行的,并且在使用垃圾收集过滤掉迭代之后计算汇总统计信息。这允许您隔离垃圾收集对运行时间的性能和影响(更多细节请参阅Neal 2014)。

时间和内存使用作为自定义对象返回,这些对象具有人类可读的显示格式(例如104ns)和比较(例如x$mem_alloc >“10 mb")。

ggplot2还完全支持绘图,包括自定义比例和格式。

使用:

bench::mark(log10(5))
#> # A tibble: 1 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 log10(5)      212ns    274ns  2334086.        0B        0

reprex包 (v2.0.1)创建于2021-08-18

编译以上所有的答案,我想到使用这些简化的tic toc函数

tic <- function(){ start.time <<- Sys.time() }
toc <- function(){ round(Sys.time() - start.time) }

用作:

tic()
Sys.sleep(3)
toc()

哪些印刷品:

时间差3秒

几个答案提到取两个__abc的差值,即。

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
end - start

这将以人类可读的格式打印结果,例如“2秒的时间差”。然而,由于单位可以变化(从"secs"“;mins"对于"days"),如果多个运行时的单位不同,则用此方法在同等基础上比较它们就不那么有用了。

对于非交互式的目的,最好指定时间单位。

具体来说,Sys.time()返回一个POSIXct对象。取两个__abc1的差值,给出一个difftime类的对象,该对象具有"units"属性。特别地,`-`操作被定义为在与POSIXct一起使用时使用difftime()。也就是说,

time2 - time1

等于

difftime(time2, time1)

要指定units属性,添加units=参数,例如。

difftime(time2, time1, units="secs")

总之,可以使用Sys.time()来测量运行时,使用指定的单位(秒,分钟等)。

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
difftime(end, start, units="secs")
library(rbenchmark)


sleep_func <- function() { Sys.sleep(0.5) }


benchmark(sleep_func())

:

 test replications elapsed relative user.self sys.self user.child sys.child


1 sleep_func()          100   50.08        1      0.02        0         NA        NA