358 Stimmen

Messung der Ausführungszeit von Funktionen in R

Gibt es in R eine standardisierte Methode zur Messung der Ausführungszeit einer Funktion?

Offensichtlich kann ich die system.time vor und nach der Ausführung und nehmen dann die Differenz davon, aber ich würde gerne wissen, ob es eine standardisierte Methode oder Funktion gibt (ich möchte das Rad nicht erfinden).


Ich glaube mich zu erinnern, dass ich einmal etwas Ähnliches wie das Folgende verwendet habe:

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

8voto

Elnaz Punkte 101

Sie können verwenden Sys.time() . Wenn Sie jedoch die Zeitdifferenz in einer Tabelle oder einer csv-Datei aufzeichnen, können Sie nicht einfach sagen end - start . Stattdessen sollten Sie die Einheit definieren:

f_name <- function (args*){
start <- Sys.time()
""" You codes here """
end <- Sys.time()
total_time <- as.numeric (end - start, units = "mins") # or secs ... 
}

Dann können Sie total_time die ein angemessenes Format hat.

3voto

bert Punkte 293

In mehreren Antworten wird erwähnt, dass die Differenz von zwei Sys.time() s, d.h..

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
end - start

Damit wird das Ergebnis in einem für Menschen lesbaren Format ausgedruckt, z. B. "Zeitunterschied von 2 Sekunden". Da die Einheit jedoch variieren kann (von "Sekunden" über "Minuten" bis hin zu "Tagen"), ist es weniger sinnvoll, mit dieser Methode beispielsweise mehrere Laufzeiten gleichberechtigt zu vergleichen, wenn sich ihre Einheiten unterscheiden.

Für nicht interaktiv ist es vorzuziehen, die Zeiteinheit anzugeben.

Konkret, Sys.time() gibt eine POSIXct Objekt. Wenn man die Differenz zweier POSIXct s geben ein Objekt der Klasse difftime die ein Attribut "Einheiten" hat. Die `-` Operation wird insbesondere definiert, um die difftime() bei Verwendung mit einem POSIXct . Das heißt,

time2 - time1

ist gleichbedeutend mit

difftime(time2, time1)

Um das Attribut units anzugeben, fügen Sie ein units= Argument, z.B..

difftime(time2, time1, units="secs")

Zusammengefasst kann man verwenden Sys.time() messen Laufzeiten mit einem angegebene Einheit (Sekunden, Minuten, etc.), d.h..

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
difftime(end, start, units="secs")

2voto

mihagazvoda Punkte 889

Basierend auf Website zum Bankpaket :

bench::mark() aus Paket bench für das Benchmarking eines oder einer Reihe von Ausdrücken verwendet wird, hat es unserer Meinung nach eine Reihe von Vorteilen gegenüber Alternativen.

  • Es werden immer die APIs mit der höchsten für das jeweilige Betriebssystem verfügbaren Genauigkeit verwendet (oft im Nanosekundenbereich).
  • Verfolgt die Speicherzuweisungen für jeden Ausdruck.
  • Verfolgt die Anzahl und Art der R Garbage Collections pro Ausdrucksiteration.
  • Überprüft standardmäßig die Gleichheit von Ausdrucksergebnissen, um zu vermeiden, dass versehentlich ungleicher Code verglichen wird.
  • Hat bench::press() die es Ihnen ermöglicht, auf einfache Weise Benchmarks über eine große Anzahl von Werten durchzuführen und zu kombinieren.
  • Verwendet standardmäßig adaptives Anhalten, wobei jeder Ausdruck für eine bestimmte Zeitspanne und nicht für eine bestimmte Anzahl von Iterationen ausgeführt wird.
  • Ausdrücke werden in Stapeln ausgeführt und zusammenfassende Statistiken werden berechnet, nachdem Iterationen mit Garbage Collections herausgefiltert wurden. Auf diese Weise können Sie die Leistung und die Auswirkungen der Garbage Collection auf die Laufzeit isolieren (weitere Einzelheiten siehe Neal 2014).

Die Zeiten und der Speicherverbrauch werden als benutzerdefinierte Objekte zurückgegeben, die für die Anzeige (z. B. 104ns) und für Vergleiche (z. B. x$mem_alloc > "10MB") eine lesbare Formatierung aufweisen.

Es gibt auch volle Unterstützung für das Plotten mit ggplot2 einschließlich benutzerdefinierter Skalen und Formatierung.

Verwendung:

bench::mark(log10(5))
#> # A tibble: 1 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 log10(5)      212ns    274ns  2334086.        0B        0

Erstellt am 2021-08-18 von der Reprex-Paket (v2.0.1)

2voto

stallingOne Punkte 3164

Aus den obigen Antworten habe ich die folgenden vereinfachten tic toc-Funktionen zusammengestellt

tic <- function(){ start.time <<- Sys.time() }
toc <- function(){ round(Sys.time() - start.time) }

zu verwenden als:

tic()
Sys.sleep(3)
toc()

und die druckt:

Zeitunterschied von 3 Sek.

0voto

svp Punkte 1554
library(rbenchmark)

sleep_func <- function() { Sys.sleep(0.5) }

benchmark(sleep_func())

aus:

 test replications elapsed relative user.self sys.self user.child sys.child

1 sleep_func()          100   50.08        1      0.02        0         NA        NA

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X