Python中字典的内存使用情况?

29 投票
4 回答
24579 浏览
提问于 2025-04-16 20:51

我在使用 sys 模块里的 getsizeof 方法来查看字典的大小时,有点困惑。下面我创建了一个简单的字典,里面有两个字符串。这两个字符串的大小明显比字典的大小要大。字典的大小可能只是字典本身的开销,也就是说,它没有考虑实际的数据。那么,怎样才能最好地计算整个字典的内存使用情况(包括键、值和字典的开销)呢?

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140

4 个回答

4

其实,字典并不是把实际的字符串存储在里面,它的工作方式有点像C/C++中的指针。所以在字典中,每添加一个元素,你只会增加一点固定的开销。

总的大小是

size = getsizeof(d)
size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys()))
9

递归的 getsizeof 可以获取实际的大小,但如果你有很多层的字典,并且只想大致估算一下大小的话,使用 json 就很方便了。

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3049
>>> getsizeof(second)
3049
>>> getsizeof(my_dictionary)
288
>>> getsizeof(json.dumps(my_dictionary))
6076
>>> size = getsizeof(my_dictionary)
>>> size += sum(map(getsizeof, my_dictionary.values())) + sum(map(getsizeof, my_dictionary.keys()))
>>> size
6495
16

来自于 Python文档

查看 递归计算大小的例子,可以了解如何递归使用getsizeof()来计算容器及其所有内容的大小。

这个函数只计算了额外的开销,但你可以使用这个链接中的方法来计算像字典这样的容器的大小。

撰写回答