Znaczenie wektoryzacji kodu

Wydajny kod w R

Colin Gillespie

Jumping Rivers & Newcastle University

Ogólna zasada

  • Wywołanie funkcji R prowadzi ostatecznie do kodu C lub FORTRAN
    • Ten kod jest bardzo mocno zoptymalizowany

Cel

  • Dostęp do kodu C lub FORTRAN tak szybko, jak to możliwe; im mniej wywołań funkcji, tym lepiej.
Wydajny kod w R

Funkcje zwektoryzowane

  • Wiele funkcji R jest zwektoryzowanych
    • Pojedyncza liczba, ale zwracają wektor
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Wektor jako wejście
mean(c(36, 48))
42
Wydajny kod w R

Generowanie liczb losowych

library(microbenchmark)
n <- 1e6
x <- vector("numeric", n)
microbenchmark(
    x <- rnorm(n),
    {
        for(i in seq_along(x))
            x[i] <- rnorm(1)
        },
    times = 10
)
# Unit: milliseconds
# expr        lq mean    uq  cld
# rnorm(n)    60   70    80  a
# Looping   2600 2700  2800   b

## Output trimmed for presentation

Porównanie

x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)

do

x <- rnorm(n)
Wydajny kod w R

Dlaczego pętla jest wolna?

Pętla
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Alokacja
x <- vector("numeric", n)
  • Pętla: jednorazowy koszt
  • Wektoryzacja: porównywalny
Generowanie
  • Pętla: milion wywołań rnorm()
  • Wektoryzacja: jedno wywołanie rnorm()
Przypisanie
  • Pętla: milion wywołań metody przypisania
  • Wektoryzacja: jedno przypisanie
Wydajny kod w R

Klub R

Druga zasada klubu R: używaj rozwiązań wektorowych wszędzie tam, gdzie to możliwe.

Wydajny kod w R

Czas na ćwiczenia!

Wydajny kod w R

Preparing Video For Download...