Importanța vectorizării codului

Scrierea codului R eficient

Colin Gillespie

Jumping Rivers & Newcastle University

Regulă generală

  • Apelarea unei funcții R conduce în final la cod C sau FORTRAN
    • Acest cod este foarte intens optimizat

Obiectiv

  • Accesați codul C sau FORTRAN cât mai direct; cu cât sunt mai puține apeluri de funcții, cu atât mai bine.
Scrierea codului R eficient

Funcții vectorizate

  • Multe funcții R sunt vectorizate
    • Un singur număr, dar returnează un vector
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Vector ca intrare
mean(c(36, 48))
42
Scrierea codului R eficient

Generarea numerelor aleatoare

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

Comparați

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

cu

x <- rnorm(n)
Scrierea codului R eficient

De ce este bucla lentă?

Buclă
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Alocare
x <- vector("numeric", n)
  • Buclă: Cost unic
  • Vectorizat: Comparabil
Generare
  • Buclă: un milion de apeluri la rnorm()
  • Vectorizat: un singur apel la rnorm()
Atribuire
  • Buclă: Un milion de apeluri la metoda de atribuire
  • Vectorizat: o singură atribuire
Scrierea codului R eficient

Clubul R

A doua regulă a clubului R: folosiți o soluție vectorizată ori de câte ori este posibil.

Scrierea codului R eficient

Să exersăm!

Scrierea codului R eficient

Preparing Video For Download...