字典的大小(以字节为单位)

Moh*_*raz 3 python python-2.7

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

小智 22

不适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
Run Code Online (Sandbox Code Playgroud)

所以找到的解决方案就是这个网站提供的功能: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
Run Code Online (Sandbox Code Playgroud)


hir*_*ist 9

sys.getsizeof 在这种情况下将有所帮助:

from sys import getsizeof

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

print(getsizeof(dct))
Run Code Online (Sandbox Code Playgroud)

特别是对于字典,大小将取决于您的python版本(最近实现已更改).

创建N大小字典的快速方法是:

from itertools import zip_longest
dct = dict(zip_longest(range(N), (), fillvalue=None))
# {0: None, 1: None, 2: None, ....}
Run Code Online (Sandbox Code Playgroud)

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

这个问题可能有关系.


ran*_*mir 6

您可以使用以下命令进行快速检查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
Run Code Online (Sandbox Code Playgroud)

如果您对 Python 字典的实际内部工作原理感兴趣,这dictobject.c是权威的资源(此处为最新的 Python 3.6 分支)。另外,请看一下dictnotes.txt.