示例:
import sys
class Test():
def __init__(self):
self.a = 'a'
self.b = 'b'
self.c = 'c'
self.d = 'd'
self.e = 'e'
if __name__ == '__main__':
test = [Test() for i in range(100000)]
print(sys.getsizeof(test))
在Windows任务管理器中:创建100000 vs 10的列表时,我的跳跃大约为20 MB。
使用sys.getsizeoff():对于100000的列表,我得到412,236字节;对于10的列表,我得到100个字节。
这似乎非常不成比例。为什么会这样?
答案 0 :(得分:2)
分配的记忆不是不成比例的;你正在创造100,000个物体!如您所见,它们占用大约34兆字节的空间:
>>> sys.getsizeof(Test())+sys.getsizeof(Test().__dict__)
344
>>> (sys.getsizeof(Test())+sys.getsizeof(Test().__dict__)) * 1000000 / 10**6
34.4 #megabytes
使用__slots__
可以获得轻微的改进,但是仍然需要大约20MB的内存来存储这100,000个对象。
>>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__)
200
>>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__) * 1000000 / 10**6
20.0 #megabytes
(归功于mensi's answer,sys.getsizeof
没有考虑参考。您可以自动完成以查看对象的大部分属性。)
参见答案:Usage of __slots__? http://docs.python.org/release/2.5.2/ref/slots.html
使用__slots__
:
class Test2():
__slots__ = ['a','b','c','d','e']
def __init__(self):
...
答案 1 :(得分:1)
每个实例引用一个dict为它的__dict__
,在我的机器上为你的例子是272字节。乘以100'000。