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

时间:2015-10-10 10:15:08

标签: python memory

我有以下二维位图:

SELECT * 
FROM products
WHERE category_id = 2 OR 
      category_id IN (SELECT category_id
                      FROM categories
                      WHERE parent = 2)
ORDER BY added_date DESC

只是出于好奇,我想检查它需要多少空间,如果它有整数而不是布尔值。所以我用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)] 检查了当前的大小,得到了 104

之后我修改了

sys.getsizeof(board),但仍然 104

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

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

这看起来很奇怪,因为我预计字符串列表的列表会浪费更多的内存而不仅仅是布尔值。

显然我遗漏了一些关于getsizeof如何计算大小的信息。任何人都可以解释我为什么会得到这样的结果。

PS 感谢zehnpard的回答,我看到我可以使用arr = [i for i in bin(num)[2:].zfill(n*n)]大致计算内存(很可能它不会计算列表,这不是对我来说很重要)。现在我看到string和int / bool的数字差异(int和boolean没有区别)

1 个答案:

答案 0 :(得分:3)

Python 3.4之后的docs for the sys module非常明确:

  

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

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

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

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