& の代わりに && を使う
2つのサイコロの目が同じかどうかを判定するために、move_square() 関数は if 文を使っています。
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 は y の値に関わらず常に FALSE です。このとき y を計算しないほうが少し処理時間を節約できます。&& 演算子はこの性質を利用しており、結果に影響がない場合は y を計算しません。
このコードでは、is_double[1] が FALSE なら、is_double[2] と is_double[3] を評価する必要はありません。したがって、& を && に置き換えることで高速化できます。
注意点として、&& は単一の論理値、すなわち長さ 1 の論理ベクトル(if 条件に渡すようなもの)にしか使えませんが、& は長さが 1 より大きいベクトルにも使えます。
この演習はコースの一部です
効率的な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)