Tempo di esecuzione della funzione di misura in R


282

Esiste un modo standardizzato in R per misurare il tempo di esecuzione della funzione?

Ovviamente posso prendere system.timeprima e dopo l'esecuzione e poi prendere la differenza di quelli, ma vorrei sapere se esiste un modo o una funzione standardizzati (vorrei non inventare la ruota).


Mi sembra di ricordare che una volta ho usato qualcosa di simile al seguente:

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
Penso che tu abbia avuto proc.timein mente la causa di cui system.timehai bisogno.
Marek,

1
Per funzioni più grandi, Rprofè bello. Fornisce un profilo di tutti i processi in una parte / funzione di codice.
Rich Scriven,

38
I nuovi utenti R che trovano questa domanda tramite google: require(microbenchmark)ora (da un paio di anni fa) è il modo standard della comunità di valutare le cose. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Questo fa un statistico confronto tra lmvs glmoltre 1000 tentativi, piuttosto che system.timeprova solo una volta.
isomorfismi

usa res <- microbenchmark(your code1,your code2)e poi print(res)per vedere una tabella o ggplot2::autoplot(res)per vedere un diagramma a scatole! rif
Travis,

Risposte:


253

Un altro modo possibile per farlo sarebbe usare Sys.time ():

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

Non è il modo più elegante per farlo, rispetto alla risposta sopra, ma sicuramente un modo per farlo.


14
Questo è molto più efficiente in termini di memoria, quindi system.time (), che copia efficacemente i suoi argomenti. È importante quando hai a che fare con dati che si adattano a malapena alla tua RAM.
Adam Ryczkowski il

2
Per le persone che usano Sys.time, si prega di leggere questo per alcuni avvertimenti: Timing codice R con Sys.time ()
李哲源

1
system.time()è stato più veloce per me. Penso che la risposta per system.time()dovrebbe essere accettata!
Gwang-Jin Kim,

Questo è il mio modo preferito per conoscere il tempo impiegato per un lungo calcolo fatto in parallelo su più core. In questo caso, il tempo dell'orologio a muro misurato attraverso questa chiamata è abbastanza accurato poiché il computer sarà molto più occupato con tutti i core calcolando che facendo qualsiasi altra cosa e il calcolo richiederà minuti o ore per il completamento. Questo è un caso d'uso molto specifico, ma vale la pena menzionarlo.
Pablo Adames

186

La funzione integrata system.time()lo farà.

Usa come: system.time(result <- myfunction(with, arguments))


1
Importante sapere è che system.time()ha un argomento gcFirstche è TRUEdi default. Questo da un lato rende la misurazione un po 'più riproducibile ma può generare un notevole sovraccarico del tempo di esecuzione totale (che non viene misurato, fuori rotta).
Jakob-r,

2
in quale unità viene misurato? per esempio, ho appena eseguito system.time(result <- myfunction(with, arguments))e ottenuto 187.564 come output, è in pochi secondi o cosa?
zsad512,

Per le persone che usano system.time, si prega di leggere questo per alcuni avvertimenti: errori "oggetto non trovato" e "simbolo imprevisto" quando si cronometra il codice R con system.time () .
李哲源

@ zsad512 Sono abbastanza sicuro che siano secondi .
Tapper

58

Come ha detto Andrie, system.time()funziona benissimo. Per funzione breve preferisco inserirvi replicate():

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

28
È meglio utilizzare il pacchetto microbenchmark perché non include il sovraccarico di replicare nei tempi.
Hadley,

37

Un modo leggermente più semplice per misurare i tempi di esecuzione è utilizzare il pacchetto rbenchmark . Questo pacchetto (facilmente) consente di specificare quante volte replicare il test e quale dovrebbe essere il benchmark relativo.

Vedi anche una domanda correlata su stats.stackexchange


6
Il microbenchmark è ancora migliore perché utilizza funzioni di temporizzazione di precisione più elevata.
Hadley,

4
@hadley Ma rbenchmark è più user-friendly in caso di confronti. Per me il microbenchmark è aggiornato system.time. rmicrobenchmark è ciò di cui abbiamo bisogno :)
Marek,

3
Il manutentore del microbenchmark è piuttosto reattivo: scommetto che aggiungerebbe tutto ciò di cui hai bisogno.
Hadley,

34

microbenchmark è un pacchetto leggero (~ 50 kB) e più o meno un modo standard in R per il benchmark di più espressioni e funzioni:

microbenchmark(myfunction(with,arguments))

Per esempio:

> 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

Qui entrambe le espressioni sono state valutate 10000 volte, con un tempo medio di esecuzione di circa 25-30 ns.


32

C'è anche proc.time()

Puoi usare allo stesso modo di Sys.timema ti dà un risultato simile a system.time.

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

la principale differenza tra l'utilizzo

system.time({ #your function here })

è che il proc.time()metodo esegue ancora la tua funzione invece di misurare solo il tempo ... e tra l'altro, mi piace usare system.timecon {}dentro così puoi mettere una serie di cose ...


25

Il pacchetto "tictoc" offre un modo molto semplice per misurare i tempi di esecuzione. La documentazione è in: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

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

Per salvare il tempo trascorso in una variabile puoi fare:

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

18

Sebbene altre soluzioni siano utili per una singola funzione, raccomando il seguente codice in cui è più generale ed efficace:

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

2
Fino ad ora non sapevo di Rprof ed è davvero fantastico! inoltre viene fornito con la base R, quindi non è necessario alcun pacchetto aggiuntivo come microbenchmarko profvis.
Simon C.

Mi chiedo se anche rprof può essere visualizzato, come ad esempio se vogliamo tracciare il tempo per ogni elemento che profila?
Zawir Amin,

@ZawirAmin C'è un modo, basta usare Rstudio >> menu profilo
TPArrow

13

Un altro modo semplice ma molto potente per farlo è usare il pacchetto profvis. Non si limita a misurare il tempo di esecuzione del codice, ma fornisce un approfondimento per ogni funzione eseguita. Può essere utilizzato anche per Shiny.

library(profvis)

profvis({
  #your code here
})

Clicca qui per alcuni esempi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.