我希望在函数中删除 Python 中的一个大项目。一些论坛建议使用del LargeObject和其他LargeObject= None。在性能方面(速度和删除项目后回收内存)哪个是最好的解决方案?
问问题
69 次
3 回答
2
关于回收内存,没有区别;假设在这两种情况下对象的引用计数都下降到 0,内存将以完全相同的方式被回收。
于 2013-02-15T14:55:31.177 回答
1
这两个语句之间的区别在于将从本地名称空间del
中删除(如果您尝试使用它,则会LargeObject
导致 a )。NameError
另一个将 a 保留LargeObject
在当前命名空间中,但它的值将是None
-- 很可能导致 aValueError
或者TypeError
如果您尝试使用它。否则,我真的看不出这两种方法有多大区别。不管怎样,如果你想恢复你的记忆,你需要确保你没有其他关于LargeObject
坐着的参考。
于 2013-02-15T14:55:31.733 回答
1
我希望del LargeObject
通话速度更快。它只编译成一条指令:
>>> import dis
>>> def fdel(foo):
... del foo
...
>>> def freassign(foo):
... foo = None
...
>>> dis.dis(fdel)
2 0 DELETE_FAST 0 (foo)
3 LOAD_CONST 0 (None)
6 RETURN_VALUE
>>> dis.dis(freassign)
2 0 LOAD_CONST 0 (None)
3 STORE_FAST 0 (foo)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
在这两种情况下,大对象的引用计数都会降低 1,如果达到 0,它将从内存中删除。
速度差异绝对是最小的:
>>> import timeit
>>> timeit.timeit('f("")', 'from __main__ import fdel as f')
0.16321110725402832
>>> timeit.timeit('f("")', 'from __main__ import freassign as f')
0.1656031608581543
这不是您需要担心的事情。
于 2013-02-15T14:56:28.177 回答