【发布时间】:2017-07-29 20:21:51
【问题描述】:
如何手动计算字典的大小(它在内存中占用的字节数)。我读到它最初是 280 字节,在第 6 个键处增加,然后在第 86 个键处增加,依此类推。我想计算当我有超过 10000 个键时它将占用的大小。
【问题讨论】:
标签: python python-2.7
如何手动计算字典的大小(它在内存中占用的字节数)。我读到它最初是 280 字节,在第 6 个键处增加,然后在第 86 个键处增加,依此类推。我想计算当我有超过 10000 个键时它将占用的大小。
【问题讨论】:
标签: python python-2.7
sys.getsizeof 在这种情况下会有所帮助:
from sys import getsizeof
dct = {'a': 5, 'b': 7}
print(getsizeof(dct))
尤其是字典的大小将取决于您的 python 版本(实现最近发生了变化)。
创建N 大小字典的快速方法是:
from itertools import zip_longest
dct = dict(zip_longest(range(N), (), fillvalue=None))
# {0: None, 1: None, 2: None, ....}
这应该有助于测试您对特定 python 版本的假设。
this question 可能是相关的。
【讨论】:
sys.getsizeof 不适用于嵌套字典,如下例所示。
>>> import sys
>>> d = { "onj1": {"name":"object 01", "id": "123"},"onj2": {"name":"object 02", "id": "124"}}
>>> d0 = {}
>>> sys.getsizeof(d0)
240
>>> sys.getsizeof(d)
240
所以找到的解决方案就是本站提供的功能:post OR github
跟随功能:
import sys
def get_size(obj, seen=None):
"""Recursively finds size of objects"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
# Important mark as seen *before* entering recursion to gracefully handle
# self-referential objects
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([get_size(v, seen) for v in obj.values()])
size += sum([get_size(k, seen) for k in obj.keys()])
elif hasattr(obj, '__dict__'):
size += get_size(obj.__dict__, seen)
elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
size += sum([get_size(i, seen) for i in obj])
return size
【讨论】:
您可以使用sys.getsizeof() 进行快速检查(它将以字节为单位返回对象的大小):
>>> import sys, itertools
>>> sys.getsizeof(dict(zip(range(1), itertools.cycle([1]))))
280
>>> sys.getsizeof(dict(zip(range(5), itertools.cycle([1]))))
280
>>> sys.getsizeof(dict(zip(range(6), itertools.cycle([1]))))
1048
>>> sys.getsizeof(dict(zip(range(85), itertools.cycle([1]))))
3352
>>> sys.getsizeof(dict(zip(range(86), itertools.cycle([1]))))
12568
>>> sys.getsizeof(dict(zip(range(87), itertools.cycle([1]))))
12568
>>> sys.getsizeof(dict(zip(range(10000), itertools.cycle([1]))))
786712
如果您对 Python 字典的实际内部工作感兴趣,dictobject.c 是权威资源(here 用于最新的 Python 3.6 分支)。另外,看看dictnotes.txt。
【讨论】:
使用sys.getsizeof 获取尺寸信息
【讨论】: