带有内容的Python深度getsizeof列表?
Posted
技术标签:
【中文标题】带有内容的Python深度getsizeof列表?【英文标题】:Python deep getsizeof list with contents? 【发布时间】:2011-01-08 04:53:28 【问题描述】:我很惊讶sys.getsizeof( 10000*[x] )
是 40036,无论 x:0、“a”、1000*“a”、。
有没有deep_getsizeof
哪个正确考虑共享内存的元素?
(这个问题来自于查看内存数据库表,如
范围(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
【问题讨论】:
【参考方案1】:10000 * [x] 将产生一个列表,该列表包含 10000 次相同的对象,因此 sizeof 实际上比您想象的更接近正确。但是,深度 sizeof 是非常有问题的,因为无法告诉 Python 何时要停止测量。每个对象都引用一个类型对象。应该计算类型对象吗?如果对 typeobject 的引用是最后一个,那么如果您删除了该对象,那么 typeobject 也会消失吗?如果列表中有多个(不同的)对象引用同一个字符串对象怎么办?应该计算一次还是多次?
简而言之,获取数据结构的大小是非常复杂的,sys.getsizeof() 不应该被添加:S
【讨论】:
+1 您必须定义任何深度内容的停止位置。是否要报告代码其他部分共享的内存?然后这几乎就是所有内容,因为它引用了object
。【参考方案2】:
看看guppy/heapy;我自己并没有过多地使用它,但是我的一些同事已经将它用于内存分析并取得了不错的效果。
文档可能会更好,但 this howto 在解释基本概念方面做得不错。
【讨论】:
谢谢Pär,会试试的;说明问题有多难。您的任何同事是否有关于在 Python 中节省内存的简短说明,可以回答例如range(1000000) -> 省份名称:列表或字典?【参考方案3】:如果您列出的只是持有相同长度的对象,您可以通过这样做获得更准确的估计数字
def getSize(array):
return sys.getsizeof(array) + len(array) * sys.getsizeof(array[0])
显然它对于可变长度的字符串效果不佳。
如果您只想在调试或开发期间计算大小并且您不关心性能,您可以递归地遍历所有项目并计算总大小。请注意,此解决方案不会正确处理对同一对象的多个引用。
【讨论】:
【参考方案4】:我为此专门编写了一个名为RememberMe
的工具。基本用法:
from rememberme import memory
a = [1, 2, 3]
b = [a, a, a]
print(memory(a)) # 172 bytes
print(memory(b)) # 260 bytes. Duplication counted only once.
希望对你有帮助。
【讨论】:
需要注意的是rememberme
需要cython。【参考方案5】:
mylist = 10000 * [x]
表示创建一个大小为 10000 的列表,其中包含对对象 x 的 10000 个引用。
对象x
未复制 - 内存中只有一个存在!!!
所以要使用 getsizeof,应该是:sys.getsizeof(mylist) + sys.getsizeof(x)
【讨论】:
不可变类型并非如此,sys.getsizeof(range(1000)) 返回的大小与 sys.getsizeof([0] * 1000) 相同 @Nadia Alramli:正是我的观点——你的两个例子都在 1000 个项目的列表上运行sys.getsizeof
——不管项目是什么,所以它们会返回相同的大小。
以上是关于带有内容的Python深度getsizeof列表?的主要内容,如果未能解决你的问题,请参考以下文章
Python 获得对象内存占用内存大小 sys.getsizeof