ジュリアにおける==と===の違い
コード 1
==
は値が同じかどうかを比較し、===
は比較する値が可変mutableかどうかによって異なる動作をする。
- Mutable: 二項が同じオブジェクトを参照しているか確認する。つまり、プログラム上で二つの変数が区別できるかどうかを返す。
- Immutable:
- 二項のタイプが同じかどうかをチェックし、
- 二項のストラクチャーが同じかどうかをチェックし、
- 各要素が
==
で同じかどうかを再帰的にチェックする。
julia> X = 1; Y = 1;
julia> X == Y
true
julia> X === Y
true
julia> X = [1]; Y = [1];
julia> X == Y
true
julia> X === Y
false
例えば、Pythonでよく見られる上記の実行結果を見てみよう。整数1
はImmutableでプログラム上で区別が付かないため、==
と===
は同じように真を返したが、1
だけを含む配列と見た場合にはX
に新しい要素が追加されたとしたらX
とY
が異なる可能性があるmutableため、単に値を比較した==
は真を返し、オブジェクト自体を比較した===
は偽を返した。
オブジェクトが何かわからなくても、この用法だけ理解すれば十分だ。
最適化
オブジェクト指向性が弱いJuliaでは、このような差はそれほど大きく感じられない。コード最適化の観点から見ると、==
と===
の比較では、シングルトンsingtoneの比較で以下のような性能差が出る。
N = 10^7
x = rand(0:9, N)
julia> @time for t ∈ 1:N
x[t] == 0
end
1.292501 seconds (30.00 M allocations: 610.336 MiB, 2.63% gc time)
julia> @time for t ∈ 1:N
x[t] === 0
end
1.016211 seconds (30.00 M allocations: 610.336 MiB, 2.77% gc time)
値は通常Immutableなので、==
よりも===
の方が早いと理解すればいい。
このような差はほとんどの場合、それほど大きくないかもしれない。当然ながら、イテラティブiterativeではない作業は、次のようなベクター演算の方がずっと速く、この際の速度差はほぼないか無意味である。
julia> @time x .== 0;
0.009509 seconds (6 allocations: 1.196 MiB)
julia> @time x .=== 0;
0.009478 seconds (6 allocations: 1.196 MiB)
環境
- OS: Windows
- julia: v1.6.1