Użyj && zamiast &
Aby sprawdzić, czy oba kości mają tę samą wartość, funkcja move_square() używa instrukcji warunkowych.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Operator & zawsze sprawdza oba swoje argumenty. Oznacza to, że jeśli wpiszesz x & y, R zawsze spróbuje obliczyć zarówno x, jak i y. W pewnych przypadkach jest to nieefektywne. Na przykład, jeśli x ma wartość FALSE, to x & y zawsze będzie równe FALSE, niezależnie od wartości y. Można zatem zaoszczędzić nieco czasu, rezygnując z obliczania y. Operator && korzysta właśnie z tej właściwości – nie oblicza y, jeśli jego wartość nie wpłynęłaby na końcowy wynik.
W tym kodzie, jeśli is_double[1] ma wartość FALSE, nie trzeba sprawdzać is_double[2] ani is_double[3]. Można więc przyspieszyć działanie kodu, zastępując & operatorem &&.
Warto pamiętać, że && działa tylko na pojedynczych wartościach logicznych, tzn. wektorach logicznych o długości 1 (takich jak te przekazywane do warunku if), natomiast & obsługuje również wektory o długości większej niż 1.
To ćwiczenie jest częścią kursu
Wydajny kod w R
Instrukcje do ćwiczenia
- Utwórz funkcję
improved_move(), podobną domove(), ale używającą operatora&&. - Używając
microbenchmark(), porównajimproved_move()z poprzednią wersjąmove().
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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)