gpt4 book ai didi

python - python 是否在循环中的迭代结束时进行垃圾收集?

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

请注意这个简单的代码:

    import random
while True:
L = list( str(random.random()))

问题:如果让这个运行,python会不会内存不足?
我问的原因:
此循环的第一次迭代会创建一个列表,并指定“L”来表示该列表。此循环的下一次迭代将创建另一个列表,“L”从前一个列表中抽出并分配给新列表。之前的列表已经失去了它的引用。之前的列表会被垃圾回收吗?如果不是在每次迭代结束时,但最终我希望?

话虽如此,只需将场景进一步扩展到多处理:

    import random
while True:
l1 = list( str(random.random()))
pseudo: multiprocessing.Queue.put(l1)
# how is l1 handled here?
# is l1 .copy()-ed to the queue or referenced by the queue?
# is l1 destoryed in this process (this while loop) at the end of iteration?

最佳答案

垃圾回收的主要手段是 CPython 中的引用计数(该语言的引用实现)。当不再有对对象的任何引用时,它占用的内存将立即释放并可以被其他 Python 对象重用。 (它可能会也可能永远不会被释放回操作系统。)有一些永远不会被释放的对象异常(exception):小整数、驻留字符串(包括文字)、空元组、None .

因此,为了回答您最初的问题,L 将在每次迭代中重新分配给一个新列表。此时,之前的列表没有引用,其内存将立即释放。

关于您的第二个示例,将某些内容放入 multiprocessing 队列中必然是一个复制操作。对象必须被序列化(用 Python 的说法是“pickled”)才能发送到新进程,新进程有自己的内存空间,无法从原始进程的内存中看到任何东西。当您在循环中将 li 重新分配给下一个列表时,前一个列表没有任何引用,将再次被释放。

在循环结束时,Ll1 变量仍然引用一个列表:您在循环的最后一次迭代中创建的列表。如果要释放这个对象,只需分别使用del Ldel l1 即可。

PS -- 当对象包含对自身的引用(直接引用或通过其他对象链间接引用)时,这称为循环引用。这些不会通过引用计数自动收集,Python 有一个单独的垃圾收集器定期运行以清理它们。

关于python - python 是否在循环中的迭代结束时进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36729249/

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