首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典大小,以字节为单位

问字典大小,以字节为单位
EN

Stack Overflow用户
提问于 2017-07-30 04:21:51
回答 4查看 18.2K关注 0票数 9

如何手动计算字典的大小(在内存中占用的字节数)。我读到它最初是280个字节,在第6个键时增加,然后在第86个键时增加,依此类推。我想要计算当我有超过10000个密钥时它将占用的大小。

EN

回答 4

Stack Overflow用户

发布于 2017-07-30 04:28:32

在这种情况下,sys.getsizeof将提供帮助:

代码语言:javascript
复制
from sys import getsizeof

dct = {'a': 5, 'b': 7}

print(getsizeof(dct))

特别是对于字典,大小将取决于您的python版本(实现最近发生了变化)。

创建N-sized字典的一种快速方法是:

代码语言:javascript
复制
from itertools import zip_longest
dct = dict(zip_longest(range(N), (), fillvalue=None))
# {0: None, 1: None, 2: None, ....}

这应该有助于测试您针对特定python版本的假设。

this question可能是相关的。

票数 18
EN

Stack Overflow用户

发布于 2020-09-09 04:09:58

sys.getsizeof不能处理嵌套的字典,如下面的示例所示。

代码语言:javascript
复制
>>> 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或github

遵循以下函数:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2017-07-30 04:28:18

您可以使用sys.getsizeof()进行快速检查(它将以字节为单位返回对象的大小):

代码语言:javascript
复制
>>> 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是权威资源(最新的Python3.6分支的here)。另外,请看一下dictnotes.txt。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45393694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档