あなたのPythonオブジェクトで50 %少ないメモリを消費します


デフォルトでは、Pythonではオブジェクトにdict属性があります.
キーあたりのオブジェクト変数にアクセスするための辞書です.
これは動的変数の作成を許可するのに便利です.
🚩しかし、この柔軟性は新しいオブジェクト変数の作成につながります.Pythonは指定した名前の新しい変数を作成します.
スロットを使用すると、データ変数を明示的に宣言できます.
その後、Pythonはメモリ上のスペースを割り当て、dict属性の作成をスキップします.
⛔また、スロット属性で宣言されていないオブジェクトの変数の作成を禁止します.
スロットを使用すると、クラスインスタンスで使用されるメモリも減少します.
スロットは、python 3を使用している場合、データクラスでも使用できます.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
🦄これが助けて、素晴らしい日を持つことを望んでください
ジェローム