줄리아의 숏 서킷

줄리아의 숏 서킷

Short Circuit in julia

개요

줄리아에서 &&||는 논리곱, 논리합일 뿐만 아니라 숏-서킷 평가Short-circuit Evaluation을 수행한다.1 가령 A && BAB가 모두 참일 때 참을 리턴하는데, 사실 A가 거짓이라면 B가 참인지 거짓인지 볼 것도 없이 A && B는 거짓이다. 숏-서킷 평가는 그 볼 것도 없는 B를 실제로 안 보는 것이다. B에 대한 계산을 생략함으로써 속도가 개선되는 상황이 있다.

같이보기

속도 비교

M = rand(0:2, 10^4, 10^4);
print(first(M))

@time if first(M) == 2 && sum(M) < 1000
    print("!!")
end
@time if sum(M) < 1000 && first(M) == 2
    print("!!")
end

두 조건문은 sum(M) < 1000first(M) == 2의 순서만 바뀌었을 뿐 정확히 같은 작업을 수행한다. 그러나 first(M) == 2는 행렬 M의 첫번째 원소가 2인지 체크만 하고, sum(M)은 모든 원소를 순회하며 덧셈을 하기 때문에 상대적으로 계산에 오래걸린다.

julia> M = rand(0:2, 10^4, 10^4);
julia> print(first(M))
0

만약 M의 첫번째 원소가 위와 같이 0이라면, sum(M) < 1000인지 확인하기 위해 sum(M)를 계산할 필요가 없다. 그 속도들은 다음과 같이 단지 순서만 바꿔도 유의미한 차이가 날 수도 있다.

julia> @time if first(M) == 2 && sum(M) < 1000
           print("!!")
       end
  0.000009 seconds

julia> @time if sum(M) < 1000 && first(M) == 2
           print("!!")
       end
  0.040485 seconds (1 allocation: 16 bytes)

환경

  • OS: Windows
  • julia: v1.7.0

  1. https://docs.julialang.org/en/v1/manual/control-flow/#Short-Circuit-Evaluation ↩︎

댓글