Mój kod jest wolny!

Wydajny kod w R

Colin Gillespie

Jumping Rivers & Newcastle University

Czy mój kod jest naprawdę wolny?

  • 1 sekunda?
  • 1 minuta?
  • 1 godzina?
Wydajny kod w R

Czy mój kod jest naprawdę wolny?

Wydajny kod w R

Benchmarking

  1. Tworzymy funkcję opakowującą testowaną operację
  2. Mierzymy jej czas w różnych scenariuszach, np. dla różnych zbiorów danych
Wydajny kod w R

Przykład: sekwencja liczb

$$ 1, 2, 3, \ldots, n $$

Opcja 1
1:n
Opcja 2
seq(1, n)
Opcja 3
seq(1, n, by = 1)
Wydajny kod w R

Opakowywanie funkcji

colon <- function(n) 1:n
colon(5)
1 2 3 4 5
seq_default <- function(n) seq(1, n)
seq_by <- function(n) seq(1, n, by = 1)
Wydajny kod w R

Pomiar czasu z system.time()

system.time(colon(1e8))
#   user  system elapsed
#  0.032   0.028   0.060
system.time(seq_default(1e8))
#   user  system elapsed
#  0.060   0.028   0.086
system.time(seq_by(1e8))
#   user  system elapsed
#  1.088   0.520   1.600
  • Czas user to czas CPU zużyty na wykonanie instrukcji użytkownika.
    • Czas system to czas CPU zużyty przez system w imieniu procesu wywołującego.
    • Czas elapsed to w przybliżeniu suma user i system – to on nas zazwyczaj interesuje.
Wydajny kod w R

Zapisywanie wyniku

Problem z

system.time(colon(1e8))

polega na tym, że wynik nie jest zapisany. Aby go zachować, należy uruchomić:

res <- colon(1e8)

Operator <- wykonuje jednocześnie:

  • Przekazanie argumentu
  • Przypisanie obiektu
system.time(res <- colon(1e8))

Operator = wykonuje jedno z:

  • Przekazanie argumentu
  • Przypisanie obiektu
# Raises an error
system.time(res = colon(1e8))
Wydajny kod w R

Czas względny

Metoda Czas bezwzględny (s) Czas względny
colon(n) 0.060 $0.060/0.060 = 1.00$
seq_default(n) 0.086 $0.086/0.060 = 1.40$
seq_by(n) 1.607 $1.60/0.060 = 26.7$
Wydajny kod w R

Pakiet microbenchmark

  • Porównuje funkcje
    • Każda funkcja jest uruchamiana wielokrotnie
library("microbenchmark")

n <- 1e8 microbenchmark(colon(n), seq_default(n), seq_by(n), times = 10) # Run each function 10 times
# Unit: milliseconds
#           expr  min   lq  mean  median   uq  max neval cld
#       colon(n)   59  130   220     202  341  391    10  a
# seq_default(n)   94  204   290     337  348  383    10  a
#      seq_by(n) 1945 2044  2260    2275 2359 2787    10   b
Wydajny kod w R

Czas na ćwiczenia!

Wydajny kod w R

Preparing Video For Download...