我很惊讶 sys.getsizeof( 10000*[x] )
是 40036,无论 x:0、“a”、1000*“a”、{}。
是否有 deep_getsizeof
哪个正确考虑共享内存的元素?
(这个问题来自于查看内存数据库表,如
range(1000000) -> 省份名称:列表或字典?)
(Mac ppc 上的 Python 是 2.6.4。)
添加: 10000*["Mississippi"] 是 10000 个指向一个 "Mississippi"的指针, 正如一些人指出的那样。试试这个:
nstates = [AlabamatoWyoming() for j in xrange(N)]
where AlabamatoWyoming() -> 一个字符串 "Alabama".. "Wyoming"。
deep_getsizeof(nstates) 是什么?
(我们怎么知道?
- 适当的 deep_getsizeof:困难,~ gc 示踪剂
- 根据总 vm 估算
- python 实现的内幕知识
- 猜。
1 月 25 日添加: 另见when-does-python-allocate-new-memory-for-identical-strings
最佳答案
10000 * [x] 将生成一个列表,该列表包含 10000 次相同的对象,因此 sizeof 实际上比您想象的更接近正确。但是,深度 sizeof 是非常有问题的,因为无法告诉 Python 何时要停止测量。每个对象都引用一个类型对象。应该计算类型对象吗?如果对 typeobject 的引用是最后一个,那么如果您删除了该对象,那么 typeobject 也会消失吗?如果列表中有多个(不同的)对象引用同一个字符串对象怎么办?应该计算一次还是多次?
简而言之,获取数据结构的大小是非常复杂的,不应该添加 sys.getsizeof() :S
关于带有内容的Python深度getsizeof列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117255/