Python-列表的垃圾收集器
我做了一个简单的循环,在每次迭代中,Python-列表的垃圾收集器,python,Python,我做了一个简单的循环,在每次迭代中,在列表中附加一个数字。 程序完成后,列表使用的内存是否会自动释放 任何人都可以向我解释一下吗?是的,当程序终止时,所有内存都会被释放。在现代操作系统中,您无法保留内存,也无法在进程终止时不释放内存 垃圾收集器用于在程序终止之前释放内存。这样长时间运行的程序就不会保留计算机的所有资源 如果您有一个大数据结构,并且希望垃圾收集器来处理它(释放它所使用的内存),那么您应该在使用完它之后删除对它的所有引用。在这种情况下,简单的del list就足够了。是的,当程序终止
在列表中附加一个数字。
程序完成后,列表使用的内存是否会自动释放
任何人都可以向我解释一下吗?是的,当程序终止时,所有内存都会被释放。在现代操作系统中,您无法保留内存,也无法在进程终止时不释放内存
垃圾收集器用于在程序终止之前释放内存。这样长时间运行的程序就不会保留计算机的所有资源
如果您有一个大数据结构,并且希望垃圾收集器来处理它(释放它所使用的内存),那么您应该在使用完它之后删除对它的所有引用。在这种情况下,简单的del list
就足够了。是的,当程序终止时,内存将被释放,在大多数实现中,当对该列表的引用计数达到零时,也就是说,当作用域中没有指向该值的变量时,内存也将被释放
您还可以使用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)
或:
等等。。。这样,您就不必在内存中分配整个列表。是的,操作系统会在进程终止后释放进程使用的内存。Python与此无关
但是,Python本身具有自动垃圾收集功能,因此它可以在运行Python程序时释放不再需要的所有内存
最后,您可能只需要使用:
if __name__ == '__main__':
list = range(100000)
要实现与您编写的完全相同的功能。终止后,所有内存将被释放,但如果您希望在执行期间高效地创建这么大的列表,请使用xrange
,它会动态生成数字
alist = [i for i in xrange(10000)]
您不必担心在python中释放内存,因为这是程序的自动特性。Python使用引用计数来管理内存,当不再引用某些内容时,Python将自动相应地分配内存。换句话说,删除对列表的所有引用应该足以释放分配给它的内存
也就是说,如果程序很大,可以使用gc.collect()
让垃圾收集器释放一些内存。然而,这通常是不必要的,因为Python的垃圾收集器设计得足够好
此外,尽管不建议这样做,而且通常也不太有用,但您也可以使用gc.disable()
禁用Python的自动垃圾收集器,这允许您作为用户以近乎C风格的方式手动分配内存。不必立即,但最终,可能在需要的时候。这个问题的答案可能重复,在这里以及其他问题中都有介绍。。。请记住,这是特定于python实现的。。。但一般来说是的,如果列表
在其他地方引用了什么?delete list
是否足以释放内存?@Bolboa包括嵌入到其他结构(如数组或字典)中的引用。请注意,这是Python 2特有的,xrange
在Py3中不存在。相反,range
现在是一个生成器。
if __name__ == '__main__':
list = range(100000)
alist = [i for i in xrange(10000)]