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 的初学者。请举例。
解决方案
您数'true'
了两次,但由于一些优化(实习和co_consts
不断合并都可以做到),Python 最终为'true'
列表中的两个值重用了相同的字符串对象。与您计算的相比,这节省了 29 个字节。
两个相等的字符串是否恰好由同一个字符串对象表示是一个实现细节。您永远不应该以一种或另一种方式依赖它,因为细节很奇怪,并且可能会更改,恕不另行通知。
推荐阅读
- go - 使用 client-go 删除作业
- python - 在机器人框架工作中导入库时出错
- python - 如何使用 Django 在主页上为多个对象添加“喜欢”?
- android - 如何在图像视图的特定坐标处添加红点?
- docker - 超时异常 Flink
- excel - 将用户表单值插入特定列中的活动行
- python - 我的 Flask Container 和 Ganache Container 之间没有连接
- python - 了解 mdptoolbox 森林示例的参数值
- javascript - 从 url 获取(使用 javascript)json(使用 nodejs 发布)的问题
- javascript - Azure AppInsights 默认 TelemetryInitializer - Javascript SDK