0Pricing
Python Academy · 강의

__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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Python 클래스가 생성되는 방식
  2. 사용자 정의 메타클래스 작성
  3. 디스크립터: __get__, __set__, __delete__
  4. __slots__와 메모리 최적화
← Python Academy(으)로 돌아가기