Python 3.3 で実装されたPEP 412では、属性辞書の処理が改善され、クラス インスタンスのメモリ フットプリントが効果的に削減されます。 __slots__
同じ目的で設計されたので、これ__slots__
以上使用する意味はありますか?
自分で答えを見つけようとして、次のテストを実行しましたが、結果はあまり意味がありません。
class Slots(object):
__slots__ = ['a', 'b', 'c', 'd', 'e']
def __init__(self):
self.a = 1
self.b = 1
self.c = 1
self.d = 1
self.e = 1
class NoSlots(object):
def __init__(self):
self.a = 1
self.b = 1
self.c = 1
self.d = 1
self.e = 1
Python 3.3 の結果:
>>> sys.getsizeof([Slots() for i in range(1000)])
Out[1]: 9024
>>> sys.getsizeof([NoSlots() for i in range(1000)])
Out[1]: 9024
Python 2.7 の結果:
>>> sys.getsizeof([Slots() for i in range(1000)])
Out[1]: 4516
>>> sys.getsizeof([NoSlots() for i in range(1000)])
Out[1]: 4516
少なくとも Python 2.7 ではサイズが異なると予想していたので、テストに何か問題があると思います。