Используйте && вместо &
Чтобы определить, совпадают ли оба кубика, функция move_square() использует условные операторы.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Оператор & всегда вычисляет оба своих аргумента. То есть при выражении x & y R всегда попытается определить значения и x, и y. В некоторых случаях это неэффективно. Например, если x равно FALSE, то результат x & y будет FALSE независимо от значения y. Значит, вычислять y не нужно, и можно сэкономить немного времени. Оператор && использует этот приём: если значение y не влияет на итоговый результат, && просто не вычисляет его.
В данном коде, если is_double[1] равно FALSE, вычислять is_double[2] и is_double[3] не нужно. Таким образом, замена & на && позволяет ускорить выполнение.
Важно учитывать, что && работает только с одиночными логическими значениями, то есть с логическими векторами длиной 1 (как те, что передаются в условие if), тогда как & работает и с векторами большей длины.
Это упражнение является частью курса
Эффективный код на R
Инструкции к упражнению
- Создайте функцию
improved_move(), аналогичную функцииmove(), но использующую&&. - С помощью
microbenchmark()сравните производительностьimproved_move()и предыдущей версииmove().
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# 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)