当前位置: 首页 > 面试题库 >

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

周浩淼
2023-03-14
问题内容

我有以下二维位图:

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的数字没有差异)


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 这是对该问题的更多甚至更好的描述: 我做一个简单的选择查询。返回列表包含确切的记录/对象数,就好像我在数据库中进行相同的查询一样,但是问题在于所有对象都是相同/相同的。 例如,这是数据库中的结果(我删除了空值): 26801 01-JAN-00 7 31-DEC-99 7 Obere Kirchstr。26 CH 8304 Walliselln 26801 01-JAN-00 2 31

  • 我有一个像这样的POJO: 我想将json反序列化为Pojo。问题是我的属性名与productType相同,但我可以预期有两种不同的返回类型或数据结构。 返回object 返回

  • https://leetcode.com/problems/find-all-numbers-dispapered-in-an-array/discuss/93007/simple-java-in-place-sort-solution 你能查一下上面的链接吗? 我看不懂密码 然后,第一个只是简单地使用我们可以检查是不是值。 第二个, 它最终也是一样的东西,只是为了证明索引值=index+1。 但

  • } 我得到了下面的结果。但是在这个结果中,高亮显示的行具有相同的列名,但是别名不同。为什么hibernate会得到相同的Cloumn? 冬眠:删除表,如果存在hibernate_sequence hibernate:删除表(如果存在)UserDetails Hibernate:如果存在,则删除表车辆Hibernate:创建表hibernate_sequence(next_val bigint)En

  • 我有以下情况: 之后,我启动三个线程中的每一个线程,它们迭代本地产品列表,并对其进行修改。 我在迭代本地产品ArrayList时获得一个ConcurrentModificationException。 为什么会出现这种情况?我假设,如果我在每个线程中创建一个完整的新列表,我可以在本地任意修改它,而不关心其他线程--我说的对吗?还是从本地列表中删除某个对象会影响pbjects,从而导致其他线程抛出并

  • 我有以下代码: 问题:是否可以替换 d - *我对这个问题的标题不太清楚-如果有问题,请编辑。 谢啦