gpt4 book ai didi

python找出已添加哪些列表以诊断内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:30 25 4
gpt4 key购买 nike

我正在尝试诊断内存泄漏。通过使用像 pymplerobjgraph 这样的工具,我可以看到在我的程序代码中主循环的每次迭代之后添加了很多大列表。这是意外的行为——列表的数量在程序启动后应该保持不变,而不是在循环中增长。

我想查看每次迭代后添加的列表。我尝试通过类似于以下(非常简化)的代码来做到这一点:

def my_func():
import objgraph
import gc
existing = objgraph.by_type("list")
for item in to_do():
gc.collect()
new = objgraph.by_type('list')
diff = [item for item in new if item not in existing]
existing = new
do_something(item)

但是,当我尝试此操作时出现以下错误:

RuntimeError: maximum recursion depth exceeded in comparison

我明白为什么会这样,但我仍然需要一种方法来调查新列表。我如何才能访问这些新列表以便调查内存泄漏?

最佳答案

如您所知,使用 item not in existing 会失败,因为它会检查是否相等,例如 a == b,这需要遍历嵌套结构。然而,平等实际上并不是我们首先感兴趣的。相反,我们想要比较身份,即a is b。这要便宜得多,因为它与对象内容无关。

作为列表理解,我们可以说

diff = [n for e in existing for n in new if n is e]

这相当浪费,因为即使我们找到了匹配项,我们也会继续搜索所有existing

def is_in(item, collection):
for c in collection:
if item is c:
return True
return False

diff = [item for item in new if not is_in(item, existing)]

最快的解决方案应该是获取existing 中的身份一次并将它们放入一个集合中以便更有效地搜索:

existing_ids = {id(item) for item in existing}
diff = [item for item in new if id(item) in existing_ids]

关于python找出已添加哪些列表以诊断内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098752/

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