Функция секундомера в R - PullRequest
       27

Функция секундомера в R

24 голосов
/ 11 ноября 2009

Есть ли функция таймера R или секундомера, аналогичная Tic / Toc ?

MATLAB?

Ответы [ 10 ]

37 голосов
/ 11 ноября 2009

В 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()

14 голосов
/ 11 ноября 2009

Существует пакет эмуляции MATLAB matlab на CRAN. Он имеет реализации tic и toc (но они выглядят очень похоже на функции в ответе Ричи Коттона; вместо "user.self" в proc.time())

используется "истек"
> 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>
8 голосов
/ 19 февраля 2013

Очень простая эквивалентность с тиками и токами, которую вы могли бы иметь:

tic=proc.time()[3]

...code...

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

Где [3], потому что мы заинтересованы в третьем элементе в векторе, возвращаемом proc.time (), то есть истекшем времени.

8 голосов
/ 11 ноября 2009

Прямых эквивалентов tic и toc не существует.

См. help(system.time), а также руководство по расширению R для профилирования. Обсуждение инструментов профилирования и профилирования также содержится в слайдах «Введение в HPC с R», на которые ссылается Высокопроизводительные вычисления с R viewview

4 голосов
/ 22 мая 2015

Подход к закрытию

Очень простой и простой способ сделать это - использовать замыкание (что означает наличие функции внутри функции):

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()
4 голосов
/ 08 мая 2015

Существует относительно новый пакет tictoc, который воспроизводит функции точно так же, как вы бы использовали их в Matlab.

http://cran.r -project.org / веб / пакеты / TicToc / index.html

## Basic use case
tic()
print("Do something...")
Sys.sleep(1)
toc()
# 1.034 sec elapsed
2 голосов
/ 05 июля 2015

Нет, но здесь решение в одну строку.

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 мой любимый с точки зрения пакетов.

2 голосов
/ 25 марта 2015

На дату 2015-03-25, и возможно раньше, Пракма Пакет содержит функции tic() и toc().

Пример:

> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000))    # kill time
> toc()
elapsed time is 18.610000 seconds 
0 голосов
/ 23 декабря 2017
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 реализует функциональность, описанную в предыдущих ответах - спасибо за вдохновение! Пакет также добавляет вложенное время, собирая время в пользовательских переменных, пользовательских сообщениях и обратных вызовах.

0 голосов
/ 07 февраля 2017

Просто для полноты: вы можете «симулировать» тик и ток в R, так что вы можете написать

tic
## do something
toc

без скобок. Хитрость заключается в том, чтобы злоупотреблять print функция, как показано в Fun: тик и ток в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...