logo

ジュリアのショートサーキット 📂ジュリア

ジュリアのショートサーキット

概要

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