Proč vektorizovat kód

Efektivní kód v R

Colin Gillespie

Jumping Rivers & Newcastle University

Obecné pravidlo

  • Volání funkce R nakonec vede ke kódu v C nebo FORTRAN
    • Tento kód je velmi silně optimalizován

Cíl

  • Přistupovat k podkladovému kódu C nebo FORTRAN co nejrychleji; čím méně volání funkcí, tím lépe.
Efektivní kód v R

Vektorizované funkce

  • Mnoho funkcí R je vektorizovaných
    • Jediné číslo, ale vrátí vektor
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Vektor jako vstup
mean(c(36, 48))
42
Efektivní kód v R

Generování náhodných čísel

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

Porovnání

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

s

x <- rnorm(n)
Efektivní kód v R

Proč je smyčka pomalá?

Smyčka
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Alokace
x <- vector("numeric", n)
  • Smyčka: jednorázový náklad
  • Vektorizace: srovnatelné
Generování
  • Smyčka: milion volání rnorm()
  • Vektorizace: jediné volání rnorm()
Přiřazení
  • Smyčka: milion volání metody přiřazení
  • Vektorizace: jediné přiřazení
Efektivní kód v R

R klub

Druhé pravidlo R klubu: kdykoli je to možné, používejte vektorizované řešení.

Efektivní kód v R

Pojďme procvičovat!

Efektivní kód v R

Preparing Video For Download...