PEP 412は、Python 3.3で実装されており、属性辞書の処理が改善され、クラスインスタンスのメモリフットプリントが効果的に削減されています。 __slots__
は同じ目的のために設計されたものですから、__slots__
を使用している点はありますか?PEP 412は__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と異なると予想していたので、私はそこにいると仮定します。テストに何か問題がある。
実際の状況の違いをまだ測定しましたか? :-)また、 '__slots__'は副作用のために(ab)使用することができます。 –
はい、私は__slots__の問題を認識していますが、それは特定のユースケースに関連するよりも学問的な疑問でした。私はいくつかのテストを実行しようとしましたが、Python 3.3または2.7では、スロットを使用するかどうかに違いはありませんでした。しかし、おそらく私のテストは間違っているので、私もそれを投稿します。 – aquavitae