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

问题描述 投票:0回答:4

当我在字典的

getsizeof
模块中使用
sys
方法时,我有点困惑。下面我创建了一个包含两个字符串的简单字典。两个字符串的大小明显大于字典的大小。字典大小可能只是字典开销,即,它没有考虑实际数据。计算整个字典的内存使用情况(键、值、字典开销)的最佳方法是什么?

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140
python dictionary memory-management
4个回答
17
投票

来自 PythonDocs

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

所以它只计算开销,但您可以使用此链接中的函数来计算像字典这样的容器。


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

4
投票

字典不会在其中存储实际的字符串,它的工作方式有点像 C/C++ 指针,因此您只会在字典中为每个元素获得恒定的开销。

总尺寸为

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

3
投票

方法:将字典序列化为字符串,然后获取字符串的大小。

我建议使用 pickle 或 json 库中的 'dumps'。 它将字典序列化为字符串。 然后你就可以获取字符串的大小。像这样:

getsizeof(pickle.dumps(my_dictionary)))

getsizeof(json.dumps(my_dictionary)))

如果字典中有ndarray,请使用“pickle”,因为“json”无法处理ndarray。

这是您修改后的示例:

from sys import getsizeof
import json
import pickle

first = 'abc'*1000
second = 'def'*1000
my_dictionary = {'first': first, 'second': second}

print('first:', getsizeof(first))
print('second',getsizeof(second))
print('dict_:', getsizeof(my_dictionary))

print('size of json dumps my_dictionary: ', getsizeof(json.dumps(my_dictionary)))
print('size of pickle dumps my_dictionary: ', getsizeof(pickle.dumps(my_dictionary)))

结果:

first: 3049
second 3049
dict_: 232
size of json dumps my_dictionary:  6076
size of pickle dumps my_dictionary:  6078
© www.soinside.com 2019 - 2024. All rights reserved.