gpt4 book ai didi

python - getsizeof 为看似不同的列表返回相同的值

转载 作者:太空宇宙 更新时间:2023-11-04 01:00:33 28 4
gpt4 key购买 nike

我有以下二维位图:

num = 521
arr = [i == '1' for i in bin(num)[2:].zfill(n*n)]
board = [arr[n*i:n*i+n] for i in xrange(n)]

出于好奇,我想检查它需要多少空间,如果它有整数而不是 bool 值。所以我用 sys.getsizeof(board) 检查了当前尺寸,得到了 104

之后我修改

arr = [int(i) for i in bin(num)[2:].zfill(n*n)] ,但仍然得到 104

然后我决定看看只用字符串能得到多少:

arr = [i for i in bin(num)[2:].zfill(n*n)],仍然显示 104

这看起来很奇怪,因为我预计字符串列表会比 bool 值浪费更多的内存。

显然我遗漏了一些有关 getsizeof 如何计算大小的信息。谁能解释我为什么会得到这样的结果。

P.S. 感谢 zehnpard 的回答,我看到我可以使用 sum(sys.getsizeof(i) for line in board for i in line) 来近似计算内存(很可能它不会计算列表,这对我来说不是那么重要)。现在我看到了字符串和 int/bool 的数字差异(int 和 boolean 没有差异)

最佳答案

docs for the sys module因为 Python 3.4 非常明确:

Only the memory consumption directly attributed to the object is accounted for, not the memory consumption of objects it refers to.

鉴于 Python 列表实际上是指向其他 Python 对象的指针数组,Python 列表包含的元素数量将影响其在内存中的大小(更多指针)但包含的对象类型不会(内存方面,它们是'包含在列表中,只需指向)。

要获取容器中所有项目的大小,您需要一个递归解决方案,文档提供了一个指向 activestate 配方的链接。 http://code.activestate.com/recipes/577504/

鉴于此配方适用于 Python 2.x,我确信此行为始终是标准行为,并且自 3.4 起在文档中明确提及。

关于python - getsizeof 为看似不同的列表返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33052836/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com