当我在字典的
getsizeof
模块中使用 sys
方法时,我有点困惑。下面我创建了一个包含两个字符串的简单字典。两个字符串的大小明显大于字典的大小。字典大小可能只是字典开销,即,它没有考虑实际数据。计算整个字典的内存使用情况(键、值、字典开销)的最佳方法是什么?
>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140
来自 PythonDocs
有关使用 getsizeof() 递归查找容器及其所有内容的大小的示例,请参阅 recursive sizeof Recipe。
所以它只计算开销,但您可以使用此链接中的函数来计算像字典这样的容器。
递归
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
字典不会在其中存储实际的字符串,它的工作方式有点像 C/C++ 指针,因此您只会在字典中为每个元素获得恒定的开销。
总尺寸为
size = getsizeof(d)
size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys()))
方法:将字典序列化为字符串,然后获取字符串的大小。
我建议使用 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