Python del语句

时间:2013-02-19 23:42:45

标签: python garbage-collection del

在Python中调用del变量。这会立即释放分配的内存还是等待垃圾收集器收集?就像在java中一样,显式调用del对释放内存的时间没有影响。

4 个答案:

答案 0 :(得分:24)

del语句不回收内存。它会删除一个引用,该引用会减少值的引用计数。如果计数为零,则可以回收内存。 CPython会立即回收内存,不需要等待垃圾收集器运行。

事实上,垃圾收集器只需要回收循环结构。

正如Waleed Khan在评论中所说,Python内存管理正常运行,你不必担心它。

答案 1 :(得分:3)

"删除名称会删除该名称与本地或全局名称空间的绑定"。不多也不少。它对名称所指向的对象没有任何作用,除了递减其引用计数,如果refcount不为零,则即使GC运行也不会收集该对象。

答案 2 :(得分:1)

此外, del语句似乎比分配无(类似于Java的样式将null 赋值给变量)快一点释放它的记忆......)。

比较:

import time, math

def measure_del():
        start = time.time()
        for i in range(0,int(math.pow(10,8))):
                    a = "123"
                    del a # <--- !!!
        end = time.time()
        print(end-start)

def measure_none():
        start = time.time()
        for i in range(0,int(math.pow(10,8))):
                    a = "123"
                    a = None # <--- !!!
        end = time.time()
        print(end-start)

导致(在idle3.4中运行):

>>> measure_del()
3.9930295944213867
>>> measure_del()
3.7402305603027344
>>> measure_del()
3.8423104286193848
>>> measure_del()
3.753770351409912
>>> measure_del()
3.7772741317749023
>>> measure_del()
3.815058946609497

>>> measure_none()
4.052351236343384
>>> measure_none()
4.130320072174072
>>> measure_none()
4.082390069961548
>>> measure_none()
4.100180625915527
>>> measure_none()
4.071730375289917
>>> measure_none()
4.136169672012329

答案 3 :(得分:0)

关于删除: 有时您必须处理大型数据集,您必须计算内存密集型操作并以递归方式将大量数据存储到变量中。为了节省 RAM,当您完成整个操作时,如果您不再在递归循环之外使用它,您应该删除该变量。您可以使用命令

del varname 后跟 Python 的垃圾收集器 gc.collect()

关于速度: 在具有监管要求的金融应用程序等应用程序中,速度是最重要的。您必须确保操作的速度在预期的时间范围内完成。