对象的总大小和对象值的总和

时间:2019-04-03 01:44:59

标签: python

我有返回深物体尺寸的函数。

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

我是从互联网(https://goshippo.com/blog/measure-real-size-any-python-object/)上获得的。 为了更好地理解,我决定对每个组件进行汇总。

这就是我所做的

obj1 = {'check':['true','true']}
print ("The total size of the object:", get_size(obj1), end ="\n\n")

print ("Dict value size:", sys.getsizeof({'check':['true','true']}))
print ("List value size:", sys.getsizeof(['true','true']))
print ("String value size of the key's dict:", sys.getsizeof('check'))
print ("String values size of List", sys.getsizeof('true')*2)
print ("Result:",str(sys.getsizeof({'check':['true','true']})+sys.getsizeof(['true','true'])+sys.getsizeof('check')+sys.getsizeof('true')*2))

这就是我所做的结果。

The total size of the object: 239

Dict value size: 136
List value size: 44
String value size of the key's dict: 30
String values size of List 58
Result: 268

为什么对象的总大小小于对象值的总和:239和268?

我是Python的初学者。请举个例子。

1 个答案:

答案 0 :(得分:1)

您要对'true'进行两次计数,但是由于进行了多次优化(interning和co_consts常量合并都可以做到),Python最终为'true'重复使用了相同的字符串对象列表中的值。与您所计算的相比,这节省了29个字节。

两个相等的字符串是否恰巧由同一字符串对象表示是实现细节。您永远不应依赖它作为一种方式,因为细节很奇怪,并且随时可能更改,恕不另行通知。