& 대신 && 사용하기
두 주사위 눈이 같은지 판단하기 위해 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라면, y의 값과 상관없이 x & y는 항상 FALSE가 되죠. 따라서 그 계산을 생략하면 약간의 처리 시간을 절약할 수 있어요. && 연산자는 이 점을 활용해, 전체 결과에 영향을 주지 않는 경우에는 y를 굳이 계산하지 않아요.
이 코드에서는 is_double[1]이 FALSE라면 is_double[2]나 is_double[3]를 평가할 필요가 없으므로, &를 &&로 바꾸면 속도를 조금 높일 수 있어요.
유의할 점은 &&는 길이가 1인 논리값, 즉 단일 논리값(예: if 조건에 넘기는 값)에서만 동작한다는 것이고, &는 길이가 1보다 큰 논리 벡터에도 동작한다는 점이에요.
이 연습은 강의의 일부입니다
효율적인 R 코드 작성
연습 안내
&&를 사용한다는 점만 제외하고move()와 유사한improved_move()함수를 만드세요.microbenchmark()를 사용해 이전 버전인move()와improved_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)