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

王林
リリース: 2024-08-27 06:01:36
オリジナル
684 人が閲覧しました

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

Leveraging __slots__ for Better Performance in Python Classes

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

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

Leveraging __slots__ for Better Performance in Python Classes

制限事項

スロット は便利なツールかもしれませんが、次のような制限があります。

  • 動的属性なし: クラス本体で スロット を定義する際、そのデフォルト属性 (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__ を活用して Python クラスのパフォーマンスを向上させるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!