__slots__와 메모리 최적화
인스턴스별 메모리 오버헤드를 줄이기 위해 __slots__를 사용합니다.
__slots__와 메모리 최적화은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
기본 __dict__ 오버헤드
기본적으로 모든 파이썬 인스턴스는 속성을 __dict__ 딕셔너리에 저장하며, 인스턴스당 일반적으로 200~400바이트의 상당한 메모리 오버헤드가 발생합니다.
import sys
class Point:
def __init__(self, x, y): self.x, self.y = x, y
p = Point(1, 2)
print(sys.getsizeof(p.__dict__)) # ~200 bytes__slots__ 선언
__slots__을 속성 이름의 시퀀스로 정의합니다. 파이썬은 딕셔너리 대신 고정 크기 배열을 할당하므로 메모리를 절약할 수 있습니다.
class SlottedPoint:
__slots__ = ("x", "y")
def __init__(self, x, y):
self.x = x
self.y = y
p = SlottedPoint(1, 2)
print(p.x, p.y) # 1 2
# p.z = 3 # AttributeError: no __dict__메모리 절약
__slots__을 사용하면 각 인스턴스에서 일반적으로 딕셔너리 기반 인스턴스보다 30~50%의 메모리를 절약할 수 있습니다. 수백만 개의 객체를 만들 때 특히 큰 차이가 납니다.
import sys
class Reg:
def __init__(self, x, y): self.x, self.y = x, y
class Slotted:
__slots__ = ("x","y")
def __init__(self, x, y): self.x, self.y = x, y
print(sys.getsizeof(Reg(1,2))) # ~56 bytes + ~200 dict
print(sys.getsizeof(Slotted(1,2))) # ~56 bytes (no dict)기본적으로 __dict__ 없음
슬롯을 사용하는 클래스에는 __dict__가 없으므로 생성한 후 임의의 속성을 추가할 수 없습니다.
class Config:
__slots__ = ("host", "port")
def __init__(self, h, p): self.host, self.port = h, p
c = Config("localhost", 8080)
# c.debug = True # AttributeError
print(hasattr(c, "__dict__")) # False__slots__로 __dict__ 유지하기
__slots__에 "__dict__"를 포함하면 인스턴스별 딕셔너리를 유지하면서도 자주 사용하는 속성을 슬롯으로 미리 선언할 수 있습니다.
class Hybrid:
__slots__ = ("x", "__dict__")
def __init__(self, x):
self.x = x
h = Hybrid(1)
h.extra = "dynamic" # allowed
print(h.extra)__slots__의 __weakref__
슬롯을 사용하는 클래스에서는 약한 참조 지원이 사라집니다. __slots__에 "__weakref__"를 추가하면 약한 참조를 다시 사용할 수 있습니다.
import weakref
class Node:
__slots__ = ("value", "__weakref__")
def __init__(self, v): self.value = v
n = Node(42)
ref = weakref.ref(n)
print(ref()) # <Node object>상속과 __slots__
부모 클래스가 __slots__을 사용하지 않으면 자식 클래스에도 __dict__가 생깁니다. 메모리를 완전히 절약하려면 계층 구조 전체에서 __slots__을 정의해야 합니다.
class Base:
__slots__ = ("x",)
class Child(Base):
__slots__ = ("y",) # no __dict__
class WithoutSlots(Base):
pass # gets __dict__ from object메모리 측정
__slots__을 추가하기 전과 후의 실제 메모리 사용량을 측정하려면 tracemalloc 또는 pympler를 사용합니다.
import tracemalloc
tracemalloc.start()
points = [SlottedPoint(i, i) for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Peak: {peak/1024/1024:.1f} MB")__slots__과 피클링
__getstate__와 __setstate__를 정의하면 슬롯을 사용하는 객체도 피클링할 수 있습니다. 또는 파이썬 3부터 슬롯을 자동으로 처리하는 기본 pickle 프로토콜을 사용할 수 있습니다.
import pickle
class Point:
__slots__ = ("x", "y")
def __init__(self, x, y): self.x, self.y = x, y
p = Point(3, 4)
data = pickle.dumps(p)
p2 = pickle.loads(data)
print(p2.x, p2.y) # 3 4__slots__을 사용하는 데이터 클래스 — 파이썬 3.10+
@dataclass에 slots=True를 전달하면 __slots__을 자동으로 생성합니다.
from dataclasses import dataclass
@dataclass(slots=True)
class Vector:
x: float
y: float
v = Vector(1.0, 2.0)
print(v.x, v.y) # 1.0 2.0
print(hasattr(v, "__dict__")) # False__slots__을 사용하는 경우
수백만 개의 인스턴스를 만들거나, 메모리가 제한되어 있거나, 속성 접근 속도가 중요할 때 __slots__을 사용합니다. 유연성이 더 중요한 범용 클래스에서는 사용하지 않는 편이 좋습니다.
# Good candidates:
# - Nodes in a large graph or tree
# - Records in a large dataset
# - High-frequency event objects
# Bad candidates:
# - Configuration objects added to ad-hoc
# - Classes that mix-in dynamic attributes빠른 확인
슬롯을 사용하는 인스턴스에서 __slots__에 나열되지 않은 속성을 설정하려고 하면 어떤 일이 발생합니까?
복습
__slots__은 인스턴스별 __dict__를 고정 배열로 대체하여 메모리를 30~50% 절약합니다. "__dict__" 또는 "__weakref__"가 필요하면 이를 포함합니다. 메모리를 완전히 절약하려면 전체 상속 계층에서 __slots__을 사용해야 합니다. 파이썬 3.10 이상에서는 @dataclass(slots=True)을 사용합니다.
자주 묻는 질문
“__slots__와 메모리 최적화” 강의는 무료인가요?
네 — “__slots__와 메모리 최적화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“__slots__와 메모리 최적화”에서 뭘 배우나요?
인스턴스별 메모리 오버헤드를 줄이기 위해 __slots__를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“__slots__와 메모리 최적화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Python 클래스가 생성되는 방식
- 사용자 정의 메타클래스 작성
- 디스크립터: __get__, __set__, __delete__
- __slots__와 메모리 최적화