Fonction de chronomètre en R

Existe-t-il une fonction de minuterie ou de chronomètre similaire à celle de MATLAB tic/toc ?

24
demandé sur Amro 2009-11-11 18:39:27

10 réponses

Il ya beaucoup d'outils de profilage en R, comme Dirk mentionné. Si vous voulez la simplicité de tic/toc, alors vous pouvez le faire en R.

EDIT: j'ai cannibalisé la fonctionnalité de collecte des ordures du paquet MATLAB, et tic vous permet maintenant de choisir si vous êtes intéressé par le temps total écoulé ou juste le temps de l'utilisateur.

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)
}

Utilisation est, par exemple, tic(); invisible(qr(matrix(runif(1e6), nrow=1e3))); toc()

37
répondu Richie Cotton 2009-11-18 17:41:42

il existe un paquet émulateur MATLAB matlab sur CRAN. Il a des implémentations de tic et toc (mais elles ressemblent beaucoup aux fonctions dans la réponse de Richie cotons;" écoulé "est utilisé à la place de" UTILISATEUR.auto " in 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>
14
répondu rcs 2009-11-11 19:18:37

les équivalents directs de tic et toc n'existent pas.

s'il vous Plaît voir help(system.time) ainsi que les Extensions de R manuel sur le profilage. Les Discussions sur les outils de profilage et de profilage se trouvent également dans L'Introduction au HPC avec des diapositives R référencées sur le High Performance Computing avec R taskview

8
répondu Dirk Eddelbuettel 2009-11-11 15:47:19

une équivalence très simple avec tic et toc que vous pourriez avoir:

tic=proc.time()[3]

...code...

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

où le [3] est parce que nous sommes intéressés par le troisième élément dans le vecteur retourné par proc.time(), qui est le temps écoulé.

8
répondu p_barill 2013-02-19 19:07:33

il existe un paquet tictoc relativement nouveau qui reproduit les caractéristiques exactement comme vous les utiliseriez dans 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
4
répondu Will 2015-05-08 01:42:10

Une Fermeture De L'Approche

Une façon très simple et très propre de le faire est d'utiliser une fermeture (ce qui signifie simplement avoir une fonction à l'intérieur d'une fonction):

tic <- function () { 
    now <- proc.time()
    function () { 
        proc.time() - now 
    }
}

Vous démarrez le chronomètre de la sorte:

toc <- tic()

Et puis, vous obtenez le temps de retour comme ceci:

toc()

qui affiche un vecteur nommé qui est imprimé comme ceci:

 user  system elapsed 
0.008   0.004   2.055 

Même avec la simplicité de cette version, vous obtenez également toutes les fonctionnalités des versions de Matlab et Richie Cotton plus la fonctionnalité supplémentaire d'être en mesure d'exécuter plusieurs minuteries:

toc1 <- tic()
toc2 <- tic()
4
répondu Jared Ross 2015-05-23 12:58:54

en date du 2015-03-25, et peut-être plus tôt, le pracma paquet contient les fonctions tic() et toc() .

exemple:

> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000))    # kill time
> toc()
elapsed time is 18.610000 seconds 
2
répondu I Like to Code 2015-07-20 20:38:46

Non, Mais voici une solution d'une ligne.

time.it<-function(f) { a<-proc.time(); out<-f(); print(proc.time()-a); out }

et un exemple d'usage:

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 

sinon, microbenchmark est mon préféré en termes de paquets.

2
répondu theoldfather 2015-10-23 01:50:51

juste pour l'exhaustivité: vous pouvez réellement "simuler" tic et toc en R, pour que vous puissiez écrire

tic
## do something
toc

sans parenthèses. L'astuce est d'abuser du print fonction, comme démontré dans Fun: tic et toc dans 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)
}

ainsi dactylographié

tic
Sys.sleep(2)
toc

devrait donner quelque chose comme ceci:

   user  system elapsed 
  0.000   0.000   2.002 

Comme je l'ai dit, c'est un truc; system.time , Rprof et les paquets tels que rbenchmark sont la façon de mesurer temps de calcul en R.

0
répondu Enrico Schumann 2017-02-15 19:25:42
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

le paquet tictoc implémente les fonctionnalités décrites par les réponses précédentes - merci pour l'inspiration! Le paquet ajoute également le timing imbriqué, collectant les timings dans les variables définies par l'utilisateur, les messages personnalisés et les callbacks.

0
répondu Sergei Izrailev 2017-12-24 05:55:15