개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 17. __slots__의 효과 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 17. __slots__의 효과

hayongwoon 2022. 5. 10. 10:41

__slots__의 효과

 앞서 블로깅을 통해 __dict__에 대해 알아보았다. 우리는 클래스를 생성할 때, 클래스 속성을 담는 딕셔너리가 생성된다는 것을 확인했다. 그리고 이러한 딕셔너리(변수를 담고 있는)를 통해 값을 수정하고 추가한다는 것도 확인했다.

 하지만 해당 클래스의 객체를 생성할 때마다 딕셔너리가 생성이 되는데, 이러한 점 때문에 다소 상황에 따라 무수히 많은 객체를 생성해야 할 때 우리는 메모리상 큰 불이익을 얻을 수 있다. 객체마다 딕셔너리가 함께 생성되기 때문!  (*딕셔너리는 키를 통해 값을 얻는 구조로 파이썬에서는 더 많은 정보를 갖고 있어 메모리가 적지 않다.)

 

메모리 상의 이득

 이러한 부분을 보완하기 위해 나온 것이 __slots__이다. __slots__를 통해 변수를 등록해 두면, 등록이 된 변수를 제한한다는 것으로 파이썬은 이해한다. 따라서 제한을 하기 때문에 등록되어 있지 않은 변수에 접근하고 수정하는 것은 불가능하다! (에러 발생) 

그리고 이렇게 __slots__를 통해 변수의 수와 이름을 제한하면 객체 별로 __dict__를 갖고있지 않는다. 그렇다고 __slots__를 갖는 것도 아님! 클래스 당 하나의 __slots__만 생성! 그렇기 때문에 상황에 따라 메모리상 큰 이점을 얻을 수 있다.

 

시간복잡도 상의 이득

 더불어 객체 내의 변수이 접근하는 경우 시간적인 부분에서도 이점을 가져갈 수 있다. __slots__를 사용하지 않는 일반적인 클래스에서는 클래스 내에 변수에 접근하려고 할 때, 우리는 해당 변수에 직접 접근을 하는 것이 아니라 실제로는 __dict__['key']를 통해 접근하는 것을 확인했다. 하지만 __slots__에 변수를 등록한 클래스의 경우 변수에 접근할 때, 딕셔너리로 거치지 않고 바로 접근이 가능하다. 때문에 시간적인 이점을 얻을 수 있다.

 

 

 *정리하면, 상황에 따라 무수히 많은 객체를 생성해야하는 경우에는 필히 클래스에 __slots__을 사용하는 것을 고려해볼 필요가 있다. 메모리상의 큰 이점과 시간복잡도에 대한 이득 두 마리 토끼를 잡을 수 있다. 

 

사용 예시

일반적인 클래스

 

변수를 제한한 클래스

만약 변수를 제한한 클래스에 새로운 변수를 만들거나 접근하려고 하면 에러가 발생할 것이다.

변수를 제한한 클래스에서 새로운 변수 생성 시