我编写了一个简单的循环,每次迭代都会向列表中添加
一个数字。当程序完成后,列表所使用的内存会自动释放吗?
if __name__ == '__main__':
for i in range(100000):
list.append(i)
请问有人可以解释一下吗?
我编写了一个简单的循环,每次迭代都会向列表中添加
一个数字。当程序完成后,列表所使用的内存会自动释放吗?
if __name__ == '__main__':
for i in range(100000):
list.append(i)
请问有人可以解释一下吗?
list
在其他地方被引用,那么delete list
是否足以释放内存? - buydadip是的,当程序终止时,内存将被释放,在大多数实现中,当指向该值的引用计数达到零时(即没有变量在作用域中指向该值),它也将被释放。
您还可以使用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
等等看...这样你就不需要在内存中分配整个列表。
是的,操作系统会在进程终止后处理并释放使用的内存。Python与此无关。
但是,Python本身具有自动垃圾回收功能,因此它会在Python程序运行时释放所有不再需要的内存。
最后,您可能应该只使用:
if __name__ == '__main__':
list = range(100000)
gc.collect()
让垃圾收集器释放一些内存。然而,这通常是不必要的,因为Python的垃圾收集器已经足够好地完成了它的工作。gc.disable()
禁用Python的自动垃圾收集器,以允许用户手动分配内存,近似于C语言的方式。所有的内存都会在程序终止时被释放,但如果你想在执行期间高效地创建如此大的列表,请使用xrange
生成数字。
alist = [i for i in xrange(10000)]
xrange
在Py3中不存在。相反,range
现在是一个生成器。 - MattDMo