Python 中的“del”语句如何工作?

问题描述 投票:0回答:4

假设我有一个变量

x
,然后尝试
del x
。这会立即释放分配的内存,还是仍会等待垃圾收集器在稍后的某个时刻收集对象(如 Java 中)?

python garbage-collection del
4个回答
38
投票

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

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

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


3
投票

“删除名称会从本地或全局名称空间中删除该名称的绑定”。不多也不少。除了减少引用计数之外,它对名称所指向的对象不执行任何操作,如果引用计数不为零,则即使运行 GC,该对象也不会被收集。


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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.