对于看似不同的列表,getsizeof返回相同的值

发布于 2021-01-29 15:01:04

我有以下二维位图:

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)]

出于好奇,我想检查一下,如果它将使用整数而不是布尔值,它将占用多少空间。所以我检查了当前大小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

这看起来很奇怪,因为我期望字符串列表列表浪费大量的内存,而不仅仅是布尔值。

显然我缺少有关getsizeof如何计算大小的信息。谁能解释我为什么得到这样的结果。

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

关注者
0
被浏览
100
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    自Python
    3.4起,sys模块文档非常明确:

    仅考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。

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

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

    鉴于此配方是针对Python 2.x的,因此我确信此行为始终是标准行为,并且从3.4版本开始在文档中已明确提及。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看