假设我有一个变量
x
,然后尝试del x
。这会立即释放分配的内存,还是仍会等待垃圾收集器在稍后的某个时刻收集对象(如 Java 中)?
del 语句不回收内存。 它删除引用,从而减少该值的引用计数。 如果计数为零,则可以回收内存。 CPython 会立即回收内存,无需等待垃圾收集器运行。
事实上,垃圾收集器只需要回收循环结构。
正如 Waleed Khan 在他的评论中所说,Python 内存管理就可以正常工作,你不必担心它。
“删除名称会从本地或全局名称空间中删除该名称的绑定”。不多也不少。除了减少引用计数之外,它对名称所指向的对象不执行任何操作,如果引用计数不为零,则即使运行 GC,该对象也不会被收集。
此外,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
关于删除: 有时,您必须处理大型数据集,必须计算内存密集型操作并以递归方式将大量数据存储到变量中。为了节省 RAM,当您完成整个操作时,如果在递归循环之外不再使用该变量,则应该删除该变量。可以使用命令
del varname 后跟 Python 的垃圾收集器 gc.collect()
关于速度: 在有监管要求的金融应用等应用中,速度是最重要的。你必须确保操作的速度在预期的时间内完成。