【发布时间】:2010-12-15 12:27:49
【问题描述】:
是否有类似于 MATLAB 的tic/toc 的 R 计时器或秒表功能?
【问题讨论】:
-
对于它的价值,谷歌搜索
[r] tic toc现在(2013 年 2 月)给出了很多答案;不知道它是否早在 2011 年 11 月...
是否有类似于 MATLAB 的tic/toc 的 R 计时器或秒表功能?
【问题讨论】:
[r] tic toc 现在(2013 年 2 月)给出了很多答案;不知道它是否早在 2011 年 11 月...
正如 Dirk 所说,R 中有很多分析工具。如果你想要 tic/toc 的简单性,那么你也可以在 R 中实现。
编辑:我已经从 MATLAB 包中蚕食了垃圾收集功能,tic 现在让您可以选择是对总经过时间感兴趣还是只对用户时间感兴趣。
tic <- function(gcFirst = TRUE, type=c("elapsed", "user.self", "sys.self"))
{
type <- match.arg(type)
assign(".type", type, envir=baseenv())
if(gcFirst) gc(FALSE)
tic <- proc.time()[type]
assign(".tic", tic, envir=baseenv())
invisible(tic)
}
toc <- function()
{
type <- get(".type", envir=baseenv())
toc <- proc.time()[type]
tic <- get(".tic", envir=baseenv())
print(toc - tic)
invisible(toc)
}
用法是,例如,tic(); invisible(qr(matrix(runif(1e6), nrow=1e3))); toc()
【讨论】:
CRAN 上有一个 MATLAB 仿真包matlab。它具有tic 和toc 的实现(但它们看起来与Richie Cottons 答案中的函数非常相似;在proc.time() 中使用“elapsed”而不是“user.self”)
> tic
function (gcFirst = FALSE)
{
if (gcFirst == TRUE) {
gc(verbose = FALSE)
}
assign("savedTime", proc.time()[3], envir = .MatlabNamespaceEnv)
invisible()
}
<environment: namespace:matlab>
> toc
function (echo = TRUE)
{
prevTime <- get("savedTime", envir = .MatlabNamespaceEnv)
diffTimeSecs <- proc.time()[3] - prevTime
if (echo) {
cat(sprintf("elapsed time is %f seconds", diffTimeSecs),
"\n")
return(invisible())
}
else {
return(diffTimeSecs)
}
}
<environment: namespace:matlab>
【讨论】:
不存在 tic 和 toc 的直接等效项。
请参阅help(system.time) 以及 R Extensions 手册中有关分析的内容。 High Performance Computing with R taskview
【讨论】:
你可以有一个非常简单的 tic 和 toc 等价:
tic=proc.time()[3]
...code...
toc=proc.time()[3] - tic
这里的[3]是因为我们对proc.time()返回的向量中的第三个元素感兴趣,也就是经过的时间。
【讨论】:
一个非常干净和简单的方法是使用闭包(这只是意味着在函数中包含一个函数):
tic <- function () {
now <- proc.time()
function () {
proc.time() - now
}
}
你像这样启动计时器:
toc <- tic()
然后你可以像这样找回时间:
toc()
输出一个命名向量,打印如下:
user system elapsed
0.008 0.004 2.055
即使这个版本很简单,您也可以获得 Matlab 和 Richie Cotton 版本的所有功能以及能够运行多个计时器的附加功能:
toc1 <- tic()
toc2 <- tic()
【讨论】:
有一个相对较新的包 tictoc 可以完全复制您在 Matlab 中使用的功能。
http://cran.r-project.org/web/packages/tictoc/index.html
## Basic use case
tic()
print("Do something...")
Sys.sleep(1)
toc()
# 1.034 sec elapsed
【讨论】:
截至 2015 年 3 月 25 日,
并且可能更早,
pracma
包包含函数tic() 和toc()。
例子:
> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000)) # kill time
> toc()
elapsed time is 18.610000 seconds
【讨论】:
不,但这是一种单行解决方案。
time.it<-function(f) { a<-proc.time(); out<-f(); print(proc.time()-a); out }
还有一个用法示例:
result<-time.it(function(){ A<-matrix(runif(5000^2),nrow=5000); b<-runif(5000); solve(A,b) } )
user system elapsed
12.788 12.268 8.623
否则,microbenchmark 是我最喜欢的软件包。
【讨论】:
为了完整起见:您实际上可以“模拟”抽动 和R中的toc,这样你就可以写了
tic
## do something
toc
没有括号。诀窍是滥用print
函数,如Fun: tic and toc in R:
tic <- 1
class(tic) <- "tic"
toc <- 1
class(toc) <- "toc"
print.tic <- function(x, ...) {
if (!exists("proc.time"))
stop("cannot measure time")
gc(FALSE)
assign(".temp.tictime", proc.time(), envir = .GlobalEnv)
}
print.toc <- function(x,...) {
if (!exists(".temp.tictime", envir = .GlobalEnv))
stop("did you tic?")
time <- get(".temp.tictime", envir = .GlobalEnv)
rm(".temp.tictime", envir = .GlobalEnv)
print(res <- structure(proc.time() - time,
class = "proc_time"), ...)
invisible(res)
}
所以打字
tic
Sys.sleep(2)
toc
应该是这样的:
user system elapsed
0.000 0.000 2.002
正如我所说,这是一个把戏; system.time、Rprof 和
rbenchmark 等包是测量的方式
R中的计算时间。
【讨论】:
install.packages("tictoc")
library(tictoc)
# Timing nested code.
# The string provided in the call to tic() becomes a prefix to the output of toc()
tic("outer")
Sys.sleep(1)
tic("middle")
Sys.sleep(2)
tic("inner")
Sys.sleep(3)
toc() # inner
# inner: 3.004 sec elapsed
toc() # middle
# middle: 5.008 sec elapsed
toc() # outer
# outer: 6.016 sec elapsed
tictoc 包实现了先前答案中描述的功能 - 感谢您的启发!该包还添加了嵌套计时,将计时收集在用户定义的变量、自定义消息和回调中。
【讨论】: