Utilisez && au lieu de &
Pour déterminer si les deux dés sont identiques, la fonction move_square() utilise des instructions if.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
L’opérateur & évalue toujours ses deux arguments. Autrement dit, si vous tapez x & y, R cherchera systématiquement à évaluer x et y. Dans certains cas, cela n’est pas optimal. Par exemple, si x vaut FALSE, alors x & y sera toujours FALSE, quelle que soit la valeur de y. Vous pouvez donc économiser un peu de temps de calcul en n’évaluant pas y. L’opérateur && exploite cette astuce : il n’évalue pas y si cela ne change pas le résultat global.
Dans ce code, si is_double[1] est FALSE, nous n’avons pas besoin d’évaluer is_double[2] ni is_double[3] ; nous pouvons donc gagner en vitesse en remplaçant & par &&.
À noter : && ne fonctionne que sur des valeurs logiques scalaires, c’est‑à‑dire des vecteurs logiques de longueur 1 (comme ceux passés dans une condition if), tandis que & fonctionne aussi sur des vecteurs de longueur supérieure à 1.
Cet exercice fait partie du cours
Écrire du code R efficace
Instructions
- Créez une fonction
improved_move()similaire àmove(), mais qui utilise&&. - À l’aide de
microbenchmark(), comparezimproved_move()à la version précédentemove().
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
# Example data
is_double
# Define the previous solution
move <- function(is_double) {
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail
}
}
# Define the improved solution
improved_move <- function(is_double) {
if (is_double[1] ___ is_double[2] ___ is_double[3]) {
current <- 11 # Go To Jail
}
}
# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)