НачатьНачать бесплатно

Используйте && вместо &

Чтобы определить, совпадают ли оба кубика, функция 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

Посмотреть курс

Инструкции к упражнению

  1. Создайте функцию improved_move(), аналогичную функции move(), но использующую &&.
  2. С помощью 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)
Редактировать и запускать код