带有内容的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 类型大小

Python 获得对象内存占用内存大小 sys.getsizeof

在 Python 中准确测量对象大小 - Sys.GetSizeOf 不起作用

Python 中的内存消耗 - 列表、下标和指针

我如何测量python中对象的内存使用情况?

python3的int类型是几位的?