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 직렬화 시 별도 처리가 필요합니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.