【问题标题】:Stopwatch function in RR中的秒表功能
【发布时间】:2010-12-15 12:27:49
【问题描述】:

是否有类似于 MATLAB 的tic/toc 的 R 计时器或秒表功能?

【问题讨论】:

  • 对于它的价值,谷歌搜索 [r] tic toc 现在(2013 年 2 月)给出了很多答案;不知道它是否早在 2011 年 11 月...

标签: matlab r


【解决方案1】:

正如 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()

【讨论】:

    【解决方案2】:

    CRAN 上有一个 MATLAB 仿真包matlab。它具有tictoc 的实现(但它们看起来与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>
    

    【讨论】:

      【解决方案3】:

      不存在 tic 和 toc 的直接等效项。

      请参阅help(system.time) 以及 R Extensions 手册中有关分析的内容。 High Performance Computing with R taskview

      上引用的“使用 R 的 HPC 简介”幻灯片中还讨论了分析和分析工具

      【讨论】:

        【解决方案4】:

        你可以有一个非常简单的 tic 和 toc 等价:

        tic=proc.time()[3]
        
        ...code...
        
        toc=proc.time()[3] - tic
        

        这里的[3]是因为我们对proc.time()返回的向量中的第三个元素感兴趣,也就是经过的时间。

        【讨论】:

          【解决方案5】:

          闭包方法

          一个非常干净和简单的方法是使用闭包(这只是意味着在函数中包含一个函数):

          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】:

            有一个相对较新的包 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
            

            【讨论】:

              【解决方案7】:

              截至 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 
              

              【讨论】:

                【解决方案8】:

                不,但这是一种单行解决方案。

                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 是我最喜欢的软件包。

                【讨论】:

                  【解决方案9】:

                  为了完整起见:您实际上可以“模拟”抽动 和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.timeRprofrbenchmark 等包是测量的方式 R中的计算时间。

                  【讨论】:

                  【解决方案10】:
                  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 包实现了先前答案中描述的功能 - 感谢您的启发!该包还添加了嵌套计时,将计时收集在用户定义的变量、自定义消息和回调中。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-10-30
                    • 1970-01-01
                    • 2021-07-26
                    • 2015-09-22
                    • 2011-10-24
                    相关资源
                    最近更新 更多