新しいクラスを作成するたびに、Python はすべての属性を動的辞書と呼ばれる dict 属性に保存します。このデフォルトの動作は柔軟性があるため便利に見えますが、多数のインスタンスを操作している場合やメモリ使用量が重要な場合、このオーバーヘッドが大きくなる可能性があります。
Python は基本的にクラス属性を保存するために辞書を使用しますが、代替手段の 1 つは スロット を使用することです。この名前を定義することで、メモリ使用量を大幅に削減する、より静的でコンパクトな構造を使用するように 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」に比べてはるかに多くのメモリを使用します。クラスのインスタンスを多数作成することを検討してください - どのアプローチがより良い選択でしょうか?
スロット は便利なツールかもしれませんが、次のような制限があります。
obj = WithSlots(1, 2) obj.z = 3 # This will raise an AttributeError
dict を スロット に追加することでこれを回避できます。
多重継承はありません: すべての基本クラスには定義された スロット が含まれている必要があります。そうでない場合、Python はインスタンス属性を格納するために辞書を使用するように戻ります。
デフォルト値なし: init メソッドで明示的にデフォルト値を初期化する必要があります。
スロットを使用できる最良のシナリオの例をいくつか書き留めました。
これは、Python で スロット が使用される方法です。クラスに他の属性が必要ないと確信しており、使用する属性を使用できる場合に使用できます。多数のインスタンス。 slots を定義することで、属性を格納するためにより効率的でコンパクトな構造を使用するように Python に指示し、メモリの節約に役立ちます。これは、メモリ使用量が懸念される場合、またはパフォーマンスを最適化する必要がある場合に特に便利です。 スロット では、新しい属性を動的に追加できないため、クラス属性が固定され、明確に定義されている場合に使用するのが最適であることに注意してください。
以上が__slots__ を活用して Python クラスのパフォーマンスを向上させるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。