【问题标题】:getsizeof returns the same value for seemingly different listsgetsizeof 为看似不同的列表返回相同的值
【发布时间】:2015-10-10 10:15:07
【问题描述】:

我有以下二维位图:

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 如何计算大小的信息。谁能解释我为什么会得到这样的结果。

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

【问题讨论】:

    标签: python memory


    【解决方案1】:

    自 Python 3.4 以来的docs for the sys module 非常明确:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多