2016-05-18 3 views
3

私は最近、友人の使用方法を__slots__と説明しました。私は彼にその結果を証明したかったし、次のコードを使用:私のクラスで__slots__を使ってサイズを変えないのはなぜですか?

import sys 


class Foo: 
    __slots__ = 'a', 'b' 

    def __init__(self, a, b): 
     self.a = a 
     self.b = b 


class Bar: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 


a = Foo(10, 20) 
b = Bar(10, 20) 

print(sys.getsizeof(a)) 
print(sys.getsizeof(b)) 

のPython 3用コンソールに出力した:Pythonの2の出力は

56 
56 

た:

72 
72 

サイズに違いがないのはなぜですか?

+0

ない重複した、しかし関連します。http:/ /stackoverflow.com/questions/11301295/measure-object-size-accurately-in-python-sys-getsizeof-not-functioning – BrenBarn

答えて

2

はPython2のために、あなたはオレンジとリンゴを比較しているという問題がある__slots__機械

にアクティブにするためにobjectから継承する必要があります。

sys.getsizeofは浅いサイズです。それはすべての内部オブジェクトのサイズを計算しません。 __slots__バージョン

、あなたはそれが通常のオブジェクト用のスロット

の数に比例して表示されます、あなたは合理的な比較を行うために、インスタンス__dict__の大きさになっているはずです。

もう1つのアプローチは、これらのオブジェクトを数百万個割り当て、オペレーティングシステムが使用したと報告するメモリ量を確認することです。

1

John La Rooyの観察は正しいです。sys.getsizeofは浅いので、正しい結果が得られません。 pymplerさんasizeofモジュールを使用して、さまざまな答えがある見ることができます:

from pympler import asizeof 

class Foo: 
    __slots__ = 'a', 'b' 

    def __init__(self, a, b): 
     self.a = a 
     self.b = b 


class Bar: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 


x = Foo(10, 20) 
y = Bar(10, 20) 

print(asizeof.asizeof(x)) 
print(asizeof.asizeof(y)) 

実行中は:

python3 test.py 

することはできます:おそらく

192 
328 
関連する問題