是否有类似于MATLAB tic/toc的R计时器或秒表功能?
答案 0 :(得分:37)
正如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()
答案 1 :(得分:14)
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>
答案 2 :(得分:8)
不存在tic和toc的直接等价物。
请参阅help(system.time)
以及有关分析的R Extensions手册。关于性能分析和分析工具的讨论也在High Performance Computing with R taskview
答案 3 :(得分:8)
你可以拥有与tic和toc非常简单的等价:
tic=proc.time()[3]
...code...
toc=proc.time()[3] - tic
其中[3]是因为我们对proc.time()返回的向量中的第三个元素感兴趣,这是经过的时间。
答案 4 :(得分:4)
有一个相对较新的包tictoc,它可以像在Matlab中一样复制这些功能。
&#xA;&#xA;http://cran.r-project.org/web/packages/tictoc/index.html
&#xA;&#xA; ##基本用例&#xA; tic()&#xA; print(“做某事......”)&#xA; Sys.sleep(1)& #xA; toc()&#xA;#1.034秒过去&#xA;
&#xA;
答案 5 :(得分:4)
一个非常简洁的方法是使用一个闭包(这意味着在一个函数中有一个函数):
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()
答案 6 :(得分:2)
截至2015-03-25日期,
可能更早,
pracma
包中包含函数tic()
和toc()
。
示例:
> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000)) # kill time
> toc()
elapsed time is 18.610000 seconds
答案 7 :(得分:2)
不,但这是一个单行解决方案。
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在包装方面是我最喜欢的。
答案 8 :(得分:0)
为了完整性:你实际上可以'模拟'抽动 和t中的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。
答案 9 :(得分:0)
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包实现了之前答案所描述的功能 - 感谢您的灵感!该软件包还添加了嵌套计时,收集用户定义变量,自定义消息和回调中的计时。