「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > __slots__ を活用して Python クラスのパフォーマンスを向上させる

__slots__ を活用して Python クラスのパフォーマンスを向上させる

2024 年 11 月 12 日に公開
ブラウズ:141

新しいクラスを作成するたびに、Python は動的辞書と呼ばれる dict 属性にすべての属性を保存します。このデフォルトの動作は柔軟性があるため便利に見えますが、多数のインスタンスを操作している場合やメモリ使用量が重要な場合、このオーバーヘッドが大きくなる可能性があります。

Leveraging __slots__ for Better Performance in Python Classes

スロット」はどのように機能しますか?

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」に比べてはるかに多くのメモリを使用します。クラスのインスタンスを多数作成することを検討してください - どのアプローチがより良い選択でしょうか?

Leveraging __slots__ for Better Performance in Python Classes

制限事項

slots は便利なツールかもしれませんが、制限があります:

  • 動的属性なし: クラス本体で スロット を定義している間、そのデフォルト属性 (dict) を無効にします。そのため、インスタンスの作成後に新しい属性をインスタンスに動的に追加することはできません。
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

dictスロット に追加することでこの問題を回避できます。

  • 多重継承なし: すべての基本クラスには定義された スロット が含まれている必要があります。そうでない場合、Python はインスタンス属性を格納するために辞書を使用するように戻ります。

  • デフォルト値なし: init メソッドで明示的にデフォルト値を初期化する必要があります。

Leveraging __slots__ for Better Performance in Python Classes

いつ使用するか

スロットを使用できる最良のシナリオの例をいくつか書き留めました:

  • 作成するインスタンスが多数あり、メモリ使用量が懸念される場合。
  • パフォーマンスを最適化する必要がある場合。
  • 既知で固定された属性がある場合。
  • 大規模なデータセットを扱う場合。

Leveraging __slots__ for Better Performance in Python Classes

最終的な考え

これは、Python で スロット が使用される方法です。クラスに他の属性が必要ないことが確実で、作業している場合にこれらを使用できます。多数のインスタンス。 slots を定義すると、属性を格納するためにより効率的でコンパクトな構造を使用するように Python に指示でき、メモリの節約に役立ちます。これは、メモリ使用量が懸念される場合、またはパフォーマンスを最適化する必要がある場合に特に便利です。 slots では、新しい属性を動的に追加できないため、クラス属性が固定され、明確に定義されている場合に使用するのが最適であることに注意してください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/conradilx/leveraging-slots-for-better-performance-in-python-classes-2ol4?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3