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.