在Python中调用del
变量。这会立即释放分配的内存还是等待垃圾收集器收集?就像在java中一样,显式调用del
对释放内存的时间没有影响。
答案 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()
关于速度: 在具有监管要求的金融应用程序等应用程序中,速度是最重要的。您必须确保操作的速度在预期的时间范围内完成。