Python 객체로 메모리를 50% 적게 사용

4848 단어 python
기본적으로 Python에서 객체에는 dict 속성이 있습니다.
키별로 개체 변수에 액세스하는 데 사용되는 사전입니다.

동적 변수의 생성을 허용하는 것이 유용합니다.

🚩그러나 철자가 틀리면 이러한 유연성으로 인해 새로운 개체 변수가 생성될 수 있습니다. 파이썬은 주어진 이름으로 새로운 변수를 생성할 것입니다.

슬롯을 사용하면 구체적으로 데이터 변수를 선언할 수 있습니다.
그런 다음 Python은 메모리에 공간을 할당하고 dict 속성 생성을 건너뜁니다.

⛔또한 Slot 속성에 선언되지 않은 개체의 변수 생성을 금지합니다.

슬롯을 사용하면 클래스 인스턴스에서 사용하는 메모리도 줄어듭니다.

python3.10 이상을 사용하는 경우 데이터 클래스에서 슬롯을 사용할 수도 있습니다. 데코레이터에 slots=True를 추가하기만 하면 됩니다.

⚡오브젝트를 많이 생성하는 경우 큰 차이가 있습니다!

from dataclasses import dataclass

# https://pypi.org/project/Pympler/
from pympler.asizeof import asizeof

# Dataclass with slots
@dataclass(frozen=True, slots=True)
class SmallObjectWithDataclass:
    first_name: str
    last_name: str

# Class with slots
class SmallObject:
    __slots__ = ["first_name", "last_name"]

    def __init__(self, first_name, last_name) -> None:
        self.first_name: str = first_name
        self.last_name: str = last_name

# Class with no slots
class BiggerObject:
    def __init__(self, first_name, last_name) -> None:
        self.first_name: str = first_name
        self.last_name: str = last_name


p = SmallObjectWithDataclass("Jerome", "K")
print(asizeof(p))  # Output: 160 Bytes
p2 = SmallObject("Jerome", "K")
print(asizeof(p2))  # Output: 160 Bytes
p3 = BiggerObject("Jerome", "K")
print(asizeof(p3))  # Output: 392 Bytes


🦄 도움이 되셨기를 바라며 즐거운 하루 보내세요
제롬

좋은 웹페이지 즐겨찾기