尽管包含大项目,python词典仍然没有增长

时间:2014-07-29 21:06:19

标签: python memory dictionary

我试图将字典划分为固定大小以下的字典,但是当我调用sys.getsizeof(d)时,它告诉我字典的大小是136而不管其内部是什么,即使单个值大于这个。为什么这样,Python词典只存储引用?有没有办法让我在运行时评估内存中的python词典大小?

1 个答案:

答案 0 :(得分:4)

sys.getsizeof()的文档具体解释了这一点:

  

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

它甚至会告诉你如何解决问题:

  

有关使用getsizeof()递归查找容器大小及其所有内容的示例,请参阅recursive sizeof recipe


那么,"直接归因于对象"意思?

正如你猜测的那样,字典只保存对象的引用。实际上,对于Python变量,对象属性,列表等几乎所有内容都是如此(有一些例外,例如array.array),它们包含实际(未装箱)的值,但它们和#39;是例外,而不是规则。)

因此,dict使用的空间是其标题的空间,以及(有效)(hash-integer, key-pointer, value-pointer)存储桶的哈希表。

哈希表以少量存储桶开始,并在表格过满时展开。所以,你不会看到内存使用情况随每个插入而增加,但每隔一段时间就会如此。 (根据您的Python实现,通过使用相同的哈希值选择不相等的值,确切地说可以游戏的频率,但如果您没有做任何奇怪的事情,它将大致保持一致。)