我试图将字典划分为固定大小以下的字典,但是当我调用sys.getsizeof(d)
时,它告诉我字典的大小是136而不管其内部是什么,即使单个值大于这个。为什么这样,Python
词典只存储引用?有没有办法让我在运行时评估内存中的python词典大小?
答案 0 :(得分:4)
sys.getsizeof()
的文档具体解释了这一点:
只考虑直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。
它甚至会告诉你如何解决问题:
有关使用
getsizeof()
递归查找容器大小及其所有内容的示例,请参阅recursive sizeof recipe。
那么,"直接归因于对象"意思?
正如你猜测的那样,字典只保存对象的引用。实际上,对于Python变量,对象属性,列表等几乎所有内容都是如此(有一些例外,例如array.array
),它们包含实际(未装箱)的值,但它们和#39;是例外,而不是规则。)
因此,dict
使用的空间是其标题的空间,以及(有效)(hash-integer, key-pointer, value-pointer)
存储桶的哈希表。
哈希表以少量存储桶开始,并在表格过满时展开。所以,你不会看到内存使用情况随每个插入而增加,但每隔一段时间就会如此。 (根据您的Python实现,通过使用相同的哈希值选择不相等的值,确切地说可以游戏的频率,但如果您没有做任何奇怪的事情,它将大致保持一致。)