26

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

4

4 回答 4

35

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

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

正如 Waleed Khan 在他的评论中所说,Python 内存管理可以正常工作,您不必担心。

于 2013-02-19T23:47:38.423 回答
3

“删除名称会从本地或全局名称空间中删除该名称的绑定”。不多也不少。它对 name 指向的对象没有任何作用,除了减少其 refcount,如果 refcount 不为零,即使 GC 运行时也不会收集该对象。

于 2013-02-19T23:46:59.320 回答
3

此外,del 语句似乎比分配 None快一点(类似于 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
于 2016-08-12T06:24:24.630 回答
0

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

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

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

于 2021-03-30T20:24:46.560 回答