【问题标题】:Python - Garbage collector for listPython - 列表的垃圾收集器
【发布时间】:2015-01-13 20:16:16
【问题描述】:

我做了一个简单的循环,每次迭代,appends 一个数字到一个列表。 程序完成后,列表使用的内存会自动释放吗?

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

谁能给我解释一下?

【问题讨论】:

标签: python


【解决方案1】:

是的,当程序终止时,所有内存都会被释放。在现代操作系统中,您无法在进程终止时保留内存并且不释放它。

垃圾收集器用于在程序终止之前释放内存。这样长时间运行的程序就不会保留计算机的所有资源。

如果你有一个大数据结构,并且你希望垃圾收集器来处理它(释放它使用的内存),你应该在使用它之后删除对它的所有引用。在这种情况下,简单的del list 就足够了。

【讨论】:

  • 请记住,这是特定于 python 实现的......但总的来说是的
  • 如果list 被其他地方引用怎么办? delete list 是否足以释放内存?
  • @Bolboa 包括隐藏在其他结构(如数组或字典)中的引用。
【解决方案2】:

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

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

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

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

实现与您编写的完全相同的东西。

【讨论】:

    【解决方案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
    

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

    【讨论】:

      【解决方案4】:

      您不必担心在 python 中释放内存,因为这是程序的自动功能。 Python 使用引用计数来管理内存,当不再引用某些内容时,python 会自动相应地分配内存。换句话说,删除对列表的所有引用应该足以释放分配给它的内存。

      也就是说,如果你的程序很大,你可以使用gc.collect() 让垃圾收集器释放一些内存。然而,这通常是不必要的,因为 Python 的垃圾收集器被设计为可以很好地完成它的工作。

      此外,虽然不建议这样做,而且通常不会很有用,但您也可以使用 gc.disable() 禁用 Python 的自动垃圾收集器,它允许您作为用户以几乎 C 风格的方式手动分配内存。

      【讨论】:

        【解决方案5】:

        所有内存将在终止后被释放,但如果您想在执行期间高效地创建如此大的列表,请使用xrange,而不是动态生成数字。

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

        【讨论】:

        • 请注意,这是特定于 Python 2 的,xrange 在 Py3 中不存在。相反,range 现在是一个生成器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2013-04-01
        相关资源
        最近更新 更多