줄리아에서 ==과 ===의 차이점
코드 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
예로써 파이썬에서 흔히 볼 수 있는 위의 실행결과를 살펴보자. 정수 1
은 Immutable하고 프로그래밍적으로 구분할 수 없어서 ==
과 ===
이 마찬가지로 참을 반환했지만, 1
만을 포함한 배열로 보았을 땐 X
에 새로운 원소가 추가된다고 했을 때 X
와 Y
가 달라질 수 있기mutable에 단순히 값을 비교한 ==
은 참을 반환하고 객체 자체를 비교한 ===
은 거짓을 반환했다.
객체가 무슨 말인지 잘 몰라도 이 용법만 이해하면 충분하다.
최적화
객체지향성이 약한 줄리아에서 이러한 차이는 크게 와닿지 않는다. 코드 최적화의 측면에서 보았을 때 ==
와 ===
는 싱글톤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