在Python中调用变量的del
。这是否会立即释放已分配的内存,还是仍在等待垃圾回收器收集?与Java不同,显式调用del
并不影响内存何时被释放。
在Python中调用变量的del
。这是否会立即释放已分配的内存,还是仍在等待垃圾回收器收集?与Java不同,显式调用del
并不影响内存何时被释放。
del语句不会回收内存。它会移除一个引用,这将减少值的引用计数。如果计数为零,则可以回收内存。CPython会立即回收内存,无需等待垃圾回收器运行。
实际上,垃圾回收器只在回收循环结构时才需要使用。
正如Waleed Khan在他的评论中所说,Python的内存管理只是工作而已,你不必担心它。
del reference
释放引用会导致内存被释放,因此垃圾回收被调用,并且(虽然没有时间保证)解释器将该内存返还给系统。如果我不将表分配给变量而是直接读取它,则它是一个孤立的对象,我必须显式地调用gc.collect()
来查找并释放它。 - Pavel Komarovimport 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
"删除名称会从本地或全局命名空间中删除该名称的绑定"。仅此而已,没有其他。它不会对名称指向的对象进行任何操作,除了减少其引用计数,如果引用计数不为零,则即使在GC运行时也不会收集对象。
del varname,然后是Python的垃圾收集器gc.collect()
关于速度: 速度是金融应用程序等具有监管要求的应用程序中最重要的因素。您必须确保操作速度在预期时间范围内完成。