PHpullh
학습 라이브러리/Python/__slots__와 메모리 최적화

PYTHON · 성능

__slots__와 메모리 최적화

__slots__를 선언하면 인스턴스마다 __dict__를 생성하지 않아 메모리를 크게 절약합니다. 수백만 개의 객체를 다루는 데이터 처리나 과학 계산에서 효과적입니다.

성능고급slotsmemoryoptimizationperformance

핵심 설명

__slots__를 선언하면 인스턴스마다 __dict__를 생성하지 않아 메모리를 크게 절약합니다. 수백만 개의 객체를 다루는 데이터 처리나 과학 계산에서 효과적입니다.

Python code

import sys

# 일반 클래스: __dict__ 사용
class PointDict:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

# __slots__ 클래스: 고정 속성만 허용
class PointSlots:
    __slots__ = ('x', 'y', 'z')

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

# 메모리 비교
pd = PointDict(1.0, 2.0, 3.0)
ps = PointSlots(1.0, 2.0, 3.0)

size_dict = sys.getsizeof(pd) + sys.getsizeof(pd.__dict__)
size_slots = sys.getsizeof(ps)

print(f"__dict__ 사용: {size_dict} bytes")
print(f"__slots__ 사용: {size_slots} bytes")
print(f"절약률: {(1 - size_slots/size_dict)*100:.1f}%")

# 대량 객체 생성 시 효과
import time

N = 1_000_000
start = time.perf_counter()
dict_points = [PointDict(i, i+1, i+2) for i in range(N)]
t_dict = time.perf_counter() - start

start = time.perf_counter()
slots_points = [PointSlots(i, i+1, i+2) for i in range(N)]
t_slots = time.perf_counter() - start

print(f"\n{N:,}개 생성 시간:")
print(f"  __dict__: {t_dict:.3f}초")
print(f"  __slots__: {t_slots:.3f}초")

# __slots__ 제한: 동적 속성 추가 불가
try:
    ps.w = 4.0
except AttributeError as e:
    print(f"\n속성 추가 오류: {e}")

학습 팁

__slots__와 상속을 함께 사용할 때, 부모와 자식 모두 __slots__를 선언해야 효과가 있습니다. 하나라도 빠지면 __dict__가 생성됩니다.

주의할 점

__slots__를 사용하면 __dict__가 없으므로 vars(obj), **obj.__dict__ 등이 작동하지 않습니다. JSON 직렬화 시 별도 처리가 필요합니다.

자주 묻는 질문

__slots__와 메모리 최적화란 무엇인가요?

__slots__ 를 선언하면 인스턴스마다 __dict__ 를 생성하지 않아 메모리를 크게 절약합니다. 수백만 개의 객체를 다루는 데이터 처리나 과학 계산에서 효과적입니다.

__slots__와 메모리 최적화 학습 시 주의할 점은 무엇인가요?

__slots__ 를 사용하면 __dict__ 가 없으므로 vars(obj) , **obj.__dict__ 등이 작동하지 않습니다. JSON 직렬화 시 별도 처리가 필요합니다.