Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用“删除大项目”;德尔拉盖滕”;或;LargeItem=无”;函数内部_Python_Performance_Optimization_Memory Management - Fatal编程技术网

Python使用“删除大项目”;德尔拉盖滕”;或;LargeItem=无”;函数内部

Python使用“删除大项目”;德尔拉盖滕”;或;LargeItem=无”;函数内部,python,performance,optimization,memory-management,Python,Performance,Optimization,Memory Management,我希望删除函数中Python中的一个大项。一些论坛建议使用del LargeObject和其他LargeObject=None。在性能方面(速度和删除项目后回收内存),哪一个是最好的解决方案?关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则将以完全相同的方式回收内存。关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则内存将以完全相同的方式回收。这两条语句之间的区别在于del将从本地命名空间中删除LargeObject(如果尝试使用它,将导致namer

我希望删除函数中Python中的一个大项。一些论坛建议使用del LargeObject和其他LargeObject=None。在性能方面(速度和删除项目后回收内存),哪一个是最好的解决方案?

关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则将以完全相同的方式回收内存。

关于回收内存,没有区别;假设两种情况下对象的refcount都降为0,则内存将以完全相同的方式回收。

这两条语句之间的区别在于
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
。请注意,两者实际上都不会删除任何对象(单独删除)。两者都只是删除对该对象的引用!请注意,两者都不会(单独)删除任何对象。两者都只是删除对该对象的引用!