Juliaのショートサーキット
概要
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
