遍历python的对象子树并计算子树的总大小(深度大小)。
objsize的Python项目详细描述
对象化
python对象子树遍历与计算 子树的总大小(深度大小)。
此模块使用python内部gc实现
穿越所有的死者。
它忽略类型对象(即isinstance(o, type)
)
例如类和模块,因为它们在所有对象中都是通用的。
它的实现不需要递归调用以获得最佳性能。
功能
- 计算单个/多个对象的深度大小。
- 排除非独占对象。
- 遍历单个/多个对象子树。
Pympler还支持通过pympler.asizeof()
确定对象深度大小。
在objsize
和pympler
之间有两个主要的区别。
objsize
具有其他功能:- 遍历对象子树:逐个遍历对象的所有子代。
- 排除非独占对象。也就是说,也从程序中的其他地方引用的对象。对于计算对象的深度大小和遍历其子对象,这是正确的。
objsize
与pympler
相比,它有一个简单而健壮的实现,代码行明显更少。 pMyPrdor实现使用递归,因此必须使用最大深度参数来避免达到Python的最大深度。objsize
,然而,使用bfs,这是更有效和更简单的遵循。 此外,pympler实现小心地处理任何对象类型。objsize
用一个简单且通用的实现来存档相同的目标,该实现具有较少的代码行。
安装
pip install objsize
基本用法
计算包含其所有成员的对象大小。
>>>importobjsize>>>objsize.get_deep_size(dict(arg1='hello',arg2='world'))348
可以通过传递多个参数来计算多个对象的深度大小:
>>>objsize.get_deep_size(['hello','world'],dict(arg1='hello',arg2='world'),{'hello','world'})652
复杂数据
objsize
可以计算对象的整个子树的大小
不管它的对象类型和深度。
例如,这里有一个复杂的数据结构,其中包括一个自引用:
my_data=(list(range(3)),list(range(3,6)))classMyClass:def__init__(self,x,y):self.x=xself.y=yself.d={'x':x,'y':y,'self':self}def__repr__(self):return"MyClass"my_obj=MyClass(*my_data)
我们可以计算my_obj
深度大小,包括它存储的数据。
>>>objsize.get_deep_size(my_obj)796
我们可能希望忽略非独占对象,例如存储在my_data
中的对象。
>>>objsize.get_exclusive_deep_size(my_obj)408
遍历
用户可以在整个子树上实现自己的功能 使用遍历方法,该方法遍历子树中的所有对象。
>>>foroinobjsize.traverse_bfs(my_obj):...print(o)...MyClass{'x':[0,1,2],'y':[3,4,5],'d':{'x':[0,1,2],'y':[3,4,5],'self':MyClass}}[0,1,2][3,4,5]{'x':[0,1,2],'y':[3,4,5],'self':MyClass}210543
与以前类似,可以忽略非独占对象。
>>>foroinobjsize.traverse_exclusive_bfs(my_obj):...print(o)...MyClass{'x':[0,1,2],'y':[3,4,5],'d':{'x':[0,1,2],'y':[3,4,5],'self':MyClass}}{'x':[0,1,2],'y':[3,4,5],'self':MyClass}