在python中使用大型对象时是否应该删除它们?

在python中使用大型对象时是否应该删除它们?,python,garbage-collection,Python,Garbage Collection,假设脚本中没有任何特定的内存优化问题,因此我的问题是关于Python编码风格的。这也意味着:尽可能快地取消对对象的引用是一种好的、常见的python实践吗?场景如下 Class A将一个对象实例化为self.foo,并要求另一个Class B存储该对象并与其他对象共享。 在某一点上,a决定不再共享self.foo,并将其从B中删除 Class A仍然有一个对foo的引用,但是我们知道这个对象从现在起就没有用了。 由于foo是一个相对较大的对象,您是否愿意从中删除引用以及如何删除?(例如,delv

假设脚本中没有任何特定的内存优化问题,因此我的问题是关于Python编码风格的。这也意味着:尽可能快地取消对对象的引用是一种好的、常见的python实践吗?场景如下

Class A
将一个对象实例化为
self.foo
,并要求另一个
Class B
存储该对象并与其他对象共享。 在某一点上,
a
决定不再共享
self.foo
,并将其从
B
中删除

Class A
仍然有一个对foo的引用,但是我们知道这个对象从现在起就没有用了。
由于foo是一个相对较大的对象,您是否愿意从中删除引用以及如何删除?(例如,
del
vs设置
self.foo=None
此决定如何影响垃圾收集器?如果在删除属性后,访问属性并查看其是否已设置的概念甚至没有意义,请使用
del
。如果在删除属性后,程序中的某些内容可能希望检查该空间并查看是否有任何内容,请使用
=None

垃圾收集器不会在意任何一种方式

del Blah
会将Blah的引用计数减少一。。。一旦不再有引用,python将对其进行垃圾收集

self.foo = None 
也会将Blah的引用计数减少一。。。一旦不再有引用,python将对其进行垃圾收集

self.foo = None 
这两种方法都不会强制销毁对象。。。只有一次提到它

* 作为一般的经验法则,我会避免使用
del
,因为它会破坏名称,并且如果您尝试在之后引用它,可能会导致代码中的其他错误


在cPython(普通的python)中,这种垃圾收集非常有规律地进行

到目前为止,根据我使用python的经验,我在垃圾收集方面没有遇到任何问题。但是,我确实采取了预防措施,这不仅是因为我不想处理任何未引用的对象,也是因为组织原因

具体回答您的问题:

1) 是的,我建议删除该对象。这将防止代码变得笨重和/或缓慢。如果代码的运行时间很长,那么这是一个特别好的决定,即使Python在垃圾收集方面做得很好

2) 无论哪种方法都可以,尽管我会使用
del
只是为了删除实际引用本身


3) 我不知道它是如何“影响垃圾收集器”的,但安全总比后悔好。

你调查过吗?我认为你的例子完全符合这一点。可能是@Michael0x2a的重复,谢谢你的链接,它很好地回答了我一半的问题。另一半是关于“pythonic方式”:在任何可能的时间取消引用对象是否是好的和常见的做法?@Niccolò关于“好的做法”的问题是基于意见的,不适合本网站的问答格式。@BartoszKP您对如何改进该问题有何建议?我关于“良好做法”的问题寻求两点。首先,正如您可能知道的那样,python社区在由pythonic和优秀代码派生的二分法中非常严格/精确。关于如何处理这种情况,它有什么要说的吗?第二,在这个网站上,我看到有人说“不寻常意味着晦涩意味着糟糕的代码”(例如)。如果我在任何时候都像问题中那样做,会不会是这样?啊,这是一个更好的答案(+1),因为你谈到了与传统的区别standpoint@JoranBeasley:好吧,jaysoncopes是正确的,如果不删除引用,对象将粘住并耗尽内存。然而,我不理解他所说的这将使程序“缓慢”。对于2,他说“任何一种方式都很好”,这是正确的,但我不理解“为了删除实际引用本身”。@DanielSank你是对的。。。当他说删除对象时,我以为他指的是
del
,传统的高内存消耗肯定会使它变慢。。。我不喜欢在真正阅读+1回答之前发表评论,因为它基本上是正确的…@JoranBeasley:正如DanielSank提到的,如果你不删除引用,它将耗尽内存,不会问任何问题。至于声称程序可能运行缓慢,您必须以一种非常低效的方式使用Python,删除它们会有所帮助。确实有可能使python程序运行缓慢。最后,将引用设置为“None”并不会删除它,它只是说它什么都不是。删除引用将删除所有可能的解析方法,从而提高效率。@JoranBeasley谢谢。抱歉-在我发布我的解释之前,没有看到您的评论:P@jaysoncopes看我上面的回答。。。同时将ref设置为None,会将
某些\u big\u对象的参考计数器减少1。。。就像使用
del
。。。我说的关于#1的话是错误的,因为我错误地认为当你说“删除对象”时,我把它理解为
del