gpt4 book ai didi

Python:破解 gc 之谜

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:16 26 4
gpt4 key购买 nike

我试图理解 gc,因为我在一个程序中有一个很大的列表,我需要删除它以释放一些急需的内存。我想回答的基本问题是我如何找到 gc 正在跟踪的内容以及已释放的内容?以下是说明我的问题的代码

import gc
old=gc.get_objects()
a=1
new=gc.get_objects()
b=[e for e in new if e not in old]
print "Problem 1: len(new)-len(old)>1 :", len(new), len(old)
print "Problem 2: none of the element in b contain a or id(a): ", a in b, id(a) in b
print "Problem 3: The reference counts are insanely high, WHY?? "

恕我直言,这是 docs 中 Unresolved 奇怪行为.对于初学者,为什么分配单个变量会为 gc 创建多个条目?为什么它们都不是我制作的变量?我在 get_objects() 中创建的变量的入口在哪里?

编辑:为了回应 martjin 的第一 react ,我检查了以下内容

a="foo"
print a in gc.get_objects()

仍然不行 :( 我如何检查 gc 是否正在跟踪 a?

最佳答案

gc.get_objects() 的结果本身不被跟踪;否则它会创建一个循环引用:

>>> import gc
>>> print gc.get_objects.__doc__
get_objects() -> [...]

Return a list of objects tracked by the collector (excluding the list
returned).

您没有看到 a 列出,因为它引用了一个低整数单例。 Python 为 -5 到 256 之间的值重复使用同一组 int 对象。因此,a = 1 不会创建要跟踪的新对象。您也不会看到任何其他原始类型。

CPython 垃圾回收只需要跟踪容器类型,即可以引用其他 值的类型,因为 GC 唯一需要做的就是打破循环引用。

请注意,在任何 Python 脚本启动时,一些自动代码已经运行。 site.py 设置你的Python路径,比如lists, mappings等,还有上面提到的memoized int values,CPython也会缓存tuple () 对象以供重用等。因此,在启动时,在一行代码开始之前,很容易就有 5k+ 个对象已经存在。

关于Python:破解 gc 之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com