Python - 列表的垃圾回收器

4

我编写了一个简单的循环,每次迭代都会向列表中添加一个数字。当程序完成后,列表所使用的内存会自动释放吗?

if __name__ == '__main__':
    for i in range(100000):
         list.append(i)

请问有人可以解释一下吗?


2
https://dev59.com/D2855IYBdhLWcg3wMBTV - Cory Kramer
不一定要立即,但最终可能需要。 - Lee Daniel Crocker
可能是如何在Python列表中立即释放已使用的内存?的重复问题。 - buydadip
这个问题的答案在这里有详细介绍,还有其他类似的问题 ^^^ ... 就像这里 https://dev59.com/D2855IYBdhLWcg3wMBTV - buydadip
5个回答

8
是的,在程序终止时,所有内存都会被释放。在现代操作系统中,您无法保留内存并在进程终止时不释放它。
垃圾回收器是用于在程序终止之前释放内存的。这样,长时间运行的程序就不会占用计算机的所有资源。
如果您有一个大型数据结构,并且希望垃圾回收器处理它(释放其使用的内存),则应在使用完毕后删除对其的所有引用。在这种情况下,简单的“del list”就足够了。

请记住,这是Python实现的具体内容,但一般而言是可以的。 - Joran Beasley
如果list在其他地方被引用,那么delete list是否足以释放内存? - buydadip
@Bolboa 包括嵌套在其他数据结构中,例如数组或字典中的引用。 - Paulo Scardine

3

是的,当程序终止时,内存将被释放,在大多数实现中,当指向该值的引用计数达到零时(即没有变量在作用域中指向该值),它也将被释放。

您还可以使用gc模块手动控制GC。

如果您只是对列表进行迭代,并且列表足够大而让您担心内存消耗,那么您可能应该检查Python生成器和生成器表达式。

因此,不要使用:

for i in range(100000):
    results.append(do_something_with(i))

for result in results:
    do_something_else_with(result)

您可以写成:

您可以编写:

partial =  (do_something_with(i) for i in range(100000))
for result in partial:
    do_something_else_with(result)

或者:

def do_something(iterable):
    for item in iterable:
        yield some_calculation(item)

def do_something_else(iterable):
    for item in iterable:
        yield some_other_calculation(item)

partial = do_something(range(100000))
for result in do_something_else(partial):
    print result

等等看...这样你就不需要在内存中分配整个列表。


3

是的,操作系统会在进程终止后处理并释放使用的内存。Python与此无关。

但是,Python本身具有自动垃圾回收功能,因此它会在Python程序运行释放所有不再需要的内存。

最后,您可能应该只使用:

if __name__ == '__main__':
    list = range(100000)

为了实现您所编写的完全相同的功能。

2
你不必担心在Python中释放内存,因为这是程序的自动功能。Python使用引用计数来管理内存,当某个对象不再被引用时,Python会自动分配相应的内存。换句话说,只需删除所有对列表的引用即可释放为其分配的内存。
尽管如此,如果你的程序很大,可以使用gc.collect()让垃圾收集器释放一些内存。然而,这通常是不必要的,因为Python的垃圾收集器已经足够好地完成了它的工作。
此外,虽然这并不推荐,且通常没有什么用处,但你也可以使用gc.disable()禁用Python的自动垃圾收集器,以允许用户手动分配内存,近似于C语言的方式。

1

所有的内存都会在程序终止时被释放,但如果你想在执行期间高效地创建如此大的列表,请使用xrange生成数字。

    alist = [i for i in xrange(10000)]

请注意,这是针对Python 2的特定内容,xrange在Py3中不存在。相反,range现在是一个生成器。 - MattDMo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接