ジュリアのショートサーキット
概要
Juliaでは、&&
と||
は論理積、論理和だけでなく、ショートサーキット評価short-circuit Evaluationを実行する1。例えば、A && B
はA
とB
が両方とも真の時に真を返すが、実際には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) < 1000
とfirst(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