新しいクラスを作成するたびに、Python は動的辞書と呼ばれる dict 属性にすべての属性を保存します。このデフォルトの動作は柔軟性があるため便利に見えますが、多数のインスタンスを操作している場合やメモリ使用量が重要な場合、このオーバーヘッドが大きくなる可能性があります。
Python は基本的にクラス属性を保存するために辞書を使用しますが、代替手段の 1 つは slots を使用することです。この名前を定義することで、メモリ使用量を大幅に削減する、より静的でコンパクトな構造を使用するように Python に指示します。これは、クラスでスロットを使用する方法の基本的な例です。
import sys class WithoutSlots: def __init__(self, x, y): self.x = x self.y = y class WithSlots: __slots__ = ['x', 'y'] def __init__(self, x, y): self.x = x self.y = y obj1 = WithoutSlots(1, 2) obj2 = WithSlots(1, 2) print(sys.getsizeof(obj1.__dict__)) # 296 print(sys.getsizeof(obj2)) # 48
上に示したように、「WithoutSlots」は「WithSlots」に比べてはるかに多くのメモリを使用します。クラスのインスタンスを多数作成することを検討してください - どのアプローチがより良い選択でしょうか?
slots は便利なツールかもしれませんが、制限があります:
obj = WithSlots(1, 2) obj.z = 3 # This will raise an AttributeError
dict を スロット に追加することでこの問題を回避できます。
多重継承なし: すべての基本クラスには定義された スロット が含まれている必要があります。そうでない場合、Python はインスタンス属性を格納するために辞書を使用するように戻ります。
デフォルト値なし: init メソッドで明示的にデフォルト値を初期化する必要があります。
スロットを使用できる最良のシナリオの例をいくつか書き留めました:
これは、Python で スロット が使用される方法です。クラスに他の属性が必要ないことが確実で、作業している場合にこれらを使用できます。多数のインスタンス。 slots を定義すると、属性を格納するためにより効率的でコンパクトな構造を使用するように Python に指示でき、メモリの節約に役立ちます。これは、メモリ使用量が懸念される場合、またはパフォーマンスを最適化する必要がある場合に特に便利です。 slots では、新しい属性を動的に追加できないため、クラス属性が固定され、明確に定義されている場合に使用するのが最適であることに注意してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3