L'importance de vectoriser votre code

Écrire du code R efficace

Colin Gillespie

Jumping Rivers & Newcastle University

Règle générale

  • Appeler une fonction R mène finalement à du code C ou FORTRAN
    • Ce code est très optimisé

But

  • Accéder le plus vite possible au code C ou FORTRAN sous-jacent ; moins il y a d'appels de fonctions, mieux c'est.
Écrire du code R efficace

Fonctions vectorisées

  • Beaucoup de fonctions R sont vectorisées
    • Entrée scalaire, mais renvoient un vecteur
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Vecteur en entrée
mean(c(36, 48))
42
Écrire du code R efficace

Générer des nombres aléatoires

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

Comparer

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

à

x <- rnorm(n)
Écrire du code R efficace

Pourquoi la boucle est-elle lente ?

Boucle
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Allocation
x <- vector("numeric", n)
  • Boucle : coût unique
  • Vectorisé : comparable
Génération
  • Boucle : un million d'appels à rnorm()
  • Vectorisé : un seul appel à rnorm()
Affectation
  • Boucle : un million d'appels à la méthode d'affectation
  • Vectorisé : une seule affectation
Écrire du code R efficace

R club

La deuxième règle du « R club » : utilisez une solution vectorisée dès que possible.

Écrire du code R efficace

Passons à la pratique !

Écrire du code R efficace

Preparing Video For Download...