Función de medición del tiempo de ejecución en R


282

¿Existe una forma estandarizada en R de medir el tiempo de ejecución de la función?

Obviamente, puedo tomar system.timeantes y después de la ejecución y luego tomar la diferencia de esos, pero me gustaría saber si hay alguna forma o función estandarizada (me gustaría no inventar la rueda).


Me parece recordar que una vez he usado algo como a continuación:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

2
Creo que lo tenías proc.timeen mente porque system.timees uno que necesitas.
Marek

1
Para funciones más grandes, Rprofes agradable. Proporciona un perfil de todos los procesos en un fragmento de código / función.
Rich Scriven el

38
Los nuevos usuarios de R que encuentran esta pregunta a través de google: require(microbenchmark)ahora es (desde hace un par de años) la forma estándar de la comunidad de cronometrar las cosas. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Esto hace una estadística comparación de lmfrente a glmmás de 1000 intentos, en lugar de system.timeprobar una sola vez.
isomorphismes

use res <- microbenchmark(your code1,your code2)y luego print(res)para ver una tabla o ggplot2::autoplot(res)para ver un diagrama de caja. ref
Travis

Respuestas:


253

Otra forma posible de hacer esto sería usar Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

No es la forma más elegante de hacerlo, en comparación con las respuestas anteriores, pero definitivamente es una forma de hacerlo.


14
Esto es mucho más eficiente en la memoria, que system.time (), que copia efectivamente sus argumentos. Es importante cuando se trata de datos que apenas caben en su RAM.
Adam Ryczkowski

2
Para las personas que usan Sys.time, lea esto para algunas advertencias: Timing R code with Sys.time ()
李哲源

1
system.time()Fue más rápido para mí. Creo que esa respuesta system.time()debe ser aceptada!
Gwang-Jin Kim

Esta es mi forma preferida de saber el tiempo que lleva un cálculo largo realizado en paralelo en múltiples núcleos. En este caso, el tiempo del reloj de pared medido a través de esta llamada es lo suficientemente preciso ya que la computadora estará mucho más ocupada con todos los núcleos calculando que haciendo cualquier otra cosa y los cálculos demoran minutos u horas en completarse. Este es un caso de uso muy específico, pero vale la pena mencionar.
Pablo Adames

186

La función incorporada system.time()lo hará.

Usar como: system.time(result <- myfunction(with, arguments))


1
Es importante saber que system.time()tiene un argumento gcFirstque es TRUEpor defecto. Esto, por un lado, hace que la medición sea un poco más reproducible, pero puede generar una sobrecarga significativa del tiempo de ejecución total (que no se mide, por supuesto).
jakob-r

2
¿En qué unidad se mide esto? por ejemplo, acabo de correr system.time(result <- myfunction(with, arguments))y obtuve 187.564 como salida, ¿eso es en segundos o qué?
zsad512

Para las personas que usan system.time, lea esto para algunas advertencias: errores de "objeto no encontrado" y "símbolo inesperado" al sincronizar el código R con system.time () .
李哲源

@ zsad512 Estoy razonablemente seguro de que son segundos .
Tapper

58

Como dijo Andrie, system.time()funciona bien. Para una función corta, prefiero ponerla replicate():

system.time( replicate(10000, myfunction(with,arguments) ) )

28
Es mejor usar el paquete de microbenchmark porque no incluye la sobrecarga de la réplica en el tiempo.
Hadley

37

Una forma un poco mejor de medir el tiempo de ejecución es utilizar el paquete rbenchmark . Este paquete (fácilmente) le permite especificar cuántas veces replicar su prueba y cuál debería ser el punto de referencia relativo.

Vea también una pregunta relacionada en stats.stackexchange


66
Microbenchmark es aún mejor porque utiliza funciones de temporización de mayor precisión.
hadley

44
@hadley Pero rbenchmark es más fácil de usar en caso de comparaciones. Para mí, microbenchmark es system.time actualizado. rmicrobenchmark es lo que necesitamos :)
Marek

3
El mantenedor de microbenchmark es bastante receptivo: apuesto a que agregará lo que sea que necesite.
hadley

34

microbenchmark es un paquete liviano (~ 50kB) y más o menos una forma estándar en R para comparar múltiples expresiones y funciones:

microbenchmark(myfunction(with,arguments))

Por ejemplo:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Aquí ambas expresiones se evaluaron 10000 veces, con un tiempo de ejecución medio de alrededor de 25-30 ns.


32

También hay proc.time()

Puede usarlo de la misma manera Sys.timepero le da un resultado similar a system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

la principal diferencia entre usar

system.time({ #your function here })

es que el proc.time()método todavía no ejecutar su función en lugar de simplemente midiendo el tiempo ... y por cierto, me gusta usar system.timecon {}el interior de lo que puede poner un conjunto de cosas ...


25

El paquete "tictoc" le brinda una forma muy simple de medir el tiempo de ejecución. La documentación está en: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Para guardar el tiempo transcurrido en una variable que puede hacer:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

18

Aunque otras soluciones son útiles para una sola función, recomiendo el siguiente código donde es más general y efectivo:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

2
No sabía sobre Rprof hasta ahora y ¡es realmente genial! Además, viene con la base R, por lo que no es necesario un paquete adicional como microbenchmarko profvis.
Simon C.

Me pregunto si también se puede visualizar rprof, como por ejemplo si queremos graficar el tiempo de cada elemento que perfila.
Zawir Amin

@ZawirAmin Hay una manera, solo usa Rstudio >> menú de perfil
TPArrow

13

Otra forma simple pero muy poderosa de hacer esto es mediante el uso del paquete profvis. No solo mide el tiempo de ejecución de su código, sino que le proporciona un desglose de cada función que ejecuta. También se puede usar para Shiny.

library(profvis)

profvis({
  #your code here
})

Haga clic aquí para ver algunos ejemplos.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.