2016-05-04 9 views
2
class Player: 
    # __slots__ = ['name','age','gsnum'] 
    def __init__(self,name,age,gsnum): 
     self.name = name 
     self.age = age 
     self.gsnum = gsnum 

私はメモリを節約するために__slots__を使用して3つの属性なぜPythonの__slots__はメモリを保存しませんか?

で、このクラスを定義した:私はまだ36として取得 、__slots__を使用していない場合、私は1つのインスタンスの36(sys.getsizeof()) を取得

メモリサイズ、

ここで問題は何ですか? 32bit版のPython 2.7

+0

あなたがスロット宣言をコメントアウトしたようです。 – Kevin

+0

私のマシンでは、この例では '__slots__'を使用して*メモリ使用量を増やしています。 – Bakuriu

+0

メモリは本当に問題ですか? PEP 412インスタンスが導入されたpython3.3は 'dict'の一部を共有できるため、インスタンスごとの' dict'のオーバーヘッドが大幅に削減されています。 – Bakuriu

答えて

5

Python Documentation状態:

デフォルト

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

強調鉱山。

class Player(object): 
    __slots__ = ['name','age','gsnum'] 
    def __init__(self,name,age,gsnum): 
     self.name = name 
     self.age = age 
     self.gsnum = gsnum 

あなたが右のそれを持っている場合は、スロットの定義に存在しない変数を割り当てるしようとするが言うことができる:あなたのクラス定義は次のようになりなければならないことを意味

AttributeErrorが表示されます。

ちなみに新しいタイプのクラス定義では、クラスは32 bytesですが、私のシステムではスロットは36 bytesです。

+0

+1 - 良いキャッチ。私はOPが古いPythonバージョンを使用していて、 'object'を継承するのを忘れていたことに気づいていませんでした。 BTW: '__slots__'は1つの属性でメモリを減らすようです。 – Bakuriu

+0

なぜオブジェクトを使用していますか?オブジェクトを使用するときにサイズをテストできます。 –

+0

@EricWang 'New Style' pythonクラス定義は、Python 3を使わない限り 'object'から継承しなければなりません。 '__slots__'はドキュメントスタイルとして新しいスタイルクラスでしか動作しません。 – Serdalis

関連する問題