Python使用“删除大项目”;德尔拉盖滕”;或;LargeItem=无”;函数内部
我希望删除函数中Python中的一个大项。一些论坛建议使用del LargeObject和其他LargeObject=None。在性能方面(速度和删除项目后回收内存),哪一个是最好的解决方案?关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则将以完全相同的方式回收内存。关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则内存将以完全相同的方式回收。这两条语句之间的区别在于Python使用“删除大项目”;德尔拉盖滕”;或;LargeItem=无”;函数内部,python,performance,optimization,memory-management,Python,Performance,Optimization,Memory Management,我希望删除函数中Python中的一个大项。一些论坛建议使用del LargeObject和其他LargeObject=None。在性能方面(速度和删除项目后回收内存),哪一个是最好的解决方案?关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则将以完全相同的方式回收内存。关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则内存将以完全相同的方式回收。这两条语句之间的区别在于del将从本地命名空间中删除LargeObject(如果尝试使用它,将导致namer
del
将从本地命名空间中删除LargeObject
(如果尝试使用它,将导致namererror
)。另一个将在当前命名空间中保留一个LargeObject
,但它的值将是None
——如果您尝试使用它,很可能会导致ValueError
或TypeError
。否则,我看不出这两种方法有多大区别。无论哪种方式,如果您想回收内存,您需要确保没有其他对LargeObject
的引用。这两个语句之间的区别是del
将从本地命名空间中删除LargeObject
(如果您尝试使用它,会导致namererror
)。另一个将在当前命名空间中保留一个LargeObject
,但它的值将是None
——如果您尝试使用它,很可能会导致ValueError
或TypeError
。否则,我看不出这两种方法有多大区别。无论哪种方式,如果您想回收内存,您需要确保没有其他对LargeObject
的引用。我希望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
在这两种情况下,大对象的ref计数都会降低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
这不是你需要担心的事情。我希望
dellargeobject
调用会更快。它只编译为一条指令:
>>> 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
在这两种情况下,大对象的ref计数都会降低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
这一点您不必担心。但如果大对象在函数中,而我返回了另一个对象(从大对象派生),是否需要删除大对象?@Gianni:函数中的局部变量在函数完成时会自动清除,因此引用计数会下降。若并没有对大对象的其他引用,那个么它将被清除。因此,不需要使用
del
。但是如果大对象在函数中,并且我返回一个不同的对象(从大对象派生),我是否需要删除大对象?@Gianni:函数中的局部变量会在函数完成时自动清除,因此ref计数会下降。若并没有对大对象的其他引用,那个么它将被清除。因此,不需要使用del
。请注意,两者实际上都不会删除任何对象(单独删除)。两者都只是删除对该对象的引用!请注意,两者都不会(单独)删除任何对象。两者都只是删除对该对象的引用!