logo

ジュリアにおける==と===の違い 📂ジュリア

ジュリアにおける==と===の違い

コード 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に新しい要素が追加されたとしたらXYが異なる可能性がある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