3

Python で経済システムのエージェントベースのモデルを構築することに興味があります。典型的なモデルには、何千ものエージェント (企業、消費者など) が含まれる場合があります。

典型的なファーム エージェント クラスは次のようになります。

class Firm(object):

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity

私のモデルのほとんどでは、属性は動的に作成されないため、次を使用してクラスを作成できます__slots__

class Firm(object):
    __slots__ = ('capital', 'labor', 'productivity')

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity

ただし、の使用は一般的に推奨されていないようです。__slots__これが の正当な/推奨される使用例であるかどうか疑問に思っています__slots__

4

1 に答える 1

6

この__slots__機能は、多数のインスタンスを作成するときにメモリを節約することを特に意図しています。__slots__ドキュメントの引用:

デフォルトでは、古いスタイルのクラスと新しいスタイルのクラスの両方のインスタンスに、属性ストレージ用のディクショナリがあります。これは、インスタンス変数がほとんどないオブジェクトのためにスペースを浪費します。多数のインスタンスを作成すると、スペースの消費が深刻になる可能性があります。

デフォルトは__slots__、新しいスタイルのクラス定義で定義することによってオーバーライドできます。__slots__宣言は一連のインスタンス変数を取り、各変数の値を保持するのに十分なスペースを各インスタンスに確保します。__dict__はインスタンスごとに作成されないため、スペースが節約されます。

まさに正しい理由でスロットを使用しているようですね。

__slots__非動的属性の副作用に使用することはお勧めできません。代わりにメタクラスを使用する必要があります。

于 2014-08-27T16:10:48.233 に答える