Verwende && statt &
Um festzustellen, ob beide Würfel gleich sind, verwendet die Funktion move_square() if-Anweisungen.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Der Operator & wertet immer beide Argumente aus. Wenn du also x & y schreibst, versucht R stets zu berechnen, was x und y sind. In manchen Fällen ist das ineffizient. Ist zum Beispiel x FALSE, dann ist x & y immer FALSE, unabhängig vom Wert von y. Du kannst dir also etwas Rechenzeit sparen, indem du es gar nicht erst berechnest. Der Operator && nutzt diesen Trick und verzichtet darauf, y zu berechnen, wenn es das Gesamtergebnis nicht beeinflusst.
In diesem Code müssen wir is_double[2] und is_double[3] nicht auswerten, wenn is_double[1] FALSE ist. Daher können wir durch den Austausch von & durch && eine Beschleunigung erreichen.
Beachte dabei: && funktioniert nur mit einzelnen logischen Werten, d. h. mit logischen Vektoren der Länge 1 (so wie du sie in eine if-Bedingung übergibst). & funktioniert hingegen auch mit Vektoren längerer Länge.
Diese Übung ist Teil des Kurses
<Kurs>Effizient R-Code schreiben</Kurs>Übungsanweisungen
- Erstelle eine Funktion
improved_move(), diemove()ähnelt, aber&&verwendet. - Vergleiche mit
microbenchmark()die Funktionimproved_move()mit der vorherigen Versionmove().
Interaktive praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
# 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)