python';s gc-从get_计数获取对象
我试图理解从python';s gc-从get_计数获取对象,python,garbage-collection,Python,Garbage Collection,我试图理解从gc.get\u count和gc.get\u objects()返回的值之间的差异 首先,文件()说: gc.get_count() 将当前集合计数作为(count0,count1, 计数2) gc.get_对象(生成=无) 返回收集器跟踪的所有对象的列表,不包括返回的列表。如果“生成”不是“无”,则仅返回收集器在该生成中跟踪的对象 现在,我运行一个简单的REPL: > import gc > gc.get_count() (692, 1, 1) > len(gc
gc.get\u count
和gc.get\u objects()
返回的值之间的差异
首先,文件()说:
gc.get_count()
将当前集合计数作为(count0,count1,
计数2)
gc.get_对象(生成=无)
返回收集器跟踪的所有对象的列表,不包括返回的列表。如果“生成”不是“无”,则仅返回收集器在该生成中跟踪的对象
现在,我运行一个简单的REPL:
> import gc
> gc.get_count()
(692, 1, 1)
> len(gc.get_objects())
6372
> len(gc.get_objects(0))
771
> len(gc.get_objects(1))
490
> len(gc.get_objects(2))
5111
> gc.get_count()
(693, 1, 1)
因此,从get_count
可以看出,三代人加起来大约有700个对象。
但是get_对象
return>6k对象。
我试图查看DEBUG\u SAVEALL
,但它似乎与任何数字都没有关联(不在get\u count
中,也不在get\u objects
中)
我的问题是:
get\u objects
中的对象与get\u count
中跟踪的对象之间的实际区别是什么?关于stackoverflow有以下两个问题:但它们似乎没有回答差异get\u count
中引用的对象(针对特定的一代)谢谢 所以我读了一些关于CPython实现()的内容,这是我学到的: 1) 基本上,
get\u count
(impl-here:)度量在一个较低级别的生成中发生的收集量,直到该生成本身被收集为止(请参见此处:)
例如,当收集第0代(第一代)时,第1代的计数增加1。
gen 0的计数在分配时增加,在释放时减少(当\allocations-\deallocations>threashold
时收集开始)
这回答了问题(1)——差异是因为它们是完全不同的东西
2) 既然问题1得到了回答,那么问题2在被问到时实际上并不相关 但是,我们可能会问另一个问题,即“如何跟踪为特定生成收集的对象?” 在Python3.8中,这是可能的,因为
get_objects
的接口已经更改,并且可以获取“属于”特定代的对象。
考虑到这一点,可以注册一个回调(通过gc.callbacks.append(callback\u方法)
),该回调将通过在清理对象之前获取对象来跟踪特定gen的集合(但请注意,您不希望实际强引用这些对象,否则只需测量即可改变行为),然后获取它们,并比较结果
我将在一段时间内不接受此答案,以便有机会获得其他答案,因为我正在回答我自己的问题。因此,我已经阅读了一些关于CPython实现()的内容,以下是我学到的: 1) 基本上,
get\u count
(impl-here:)度量在一个较低级别的生成中发生的收集量,直到该生成本身被收集为止(请参见此处:)
例如,当收集第0代(第一代)时,第1代的计数增加1。
gen 0的计数在分配时增加,在释放时减少(当\allocations-\deallocations>threashold
时收集开始)
这回答了问题(1)——差异是因为它们是完全不同的东西
2) 既然问题1得到了回答,那么问题2在被问到时实际上并不相关 但是,我们可能会问另一个问题,即“如何跟踪为特定生成收集的对象?” 在Python3.8中,这是可能的,因为
get_objects
的接口已经更改,并且可以获取“属于”特定代的对象。
考虑到这一点,可以注册一个回调(通过gc.callbacks.append(callback\u方法)
),该回调将通过在清理对象之前获取对象来跟踪特定gen的集合(但请注意,您不希望实际强引用这些对象,否则只需测量即可改变行为),然后获取它们,并比较结果
我将在一段时间内不接受这个答案,以便有机会获得其他答案,因为我正在回答我自己的问题。我猜
get\u count()
返回上一个周期收集的对象数,get\u objects()
是仍然存在的对象。@barmar-它不同,不是收集的对象数量,而是收集的数量(比这更精细,请参见下面的答案)。我猜get\u count()
返回上一个周期收集的对象数量,get\u objects()
是仍然活动的对象。@barmar-它是不同的,不是收集对象的数量,而是收集的数量(比这更精确,请参见下面我的答案)。