在 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 的大小会有所不同,所以我认为测试有问题。