作者:ChiuChiuLIN | 来源:互联网 | 2023-08-30 15:27
class Duck():
def __init__(self):
print("complex operation oink oink !!!")
duck = Duck()
duck = None
我想这是一个非常糟糕的主意,但是......为什么?就像我经常这样做一样,它似乎每时每刻都在工作,所以我想知道,这只是纯粹的理论偏见还是真的很危险,如果是,在这种情况下以及如何检测它?(如果觉得问题太长可以对标题回答yes或者no^^,或者如果答案太长给个链接好理解)
先感谢您
回答
将变量设置为 None(假设它们是对其值的唯一引用)将允许垃圾收集器收集它们。而在 CPython(它使用 ref 计数作为其垃圾收集器)中,它甚至会立即这样做。
但另一方面,您还向必须由解释器执行的函数添加了更多字节码,这使得代码对象更难以保存在缓存中,等等。
请记住,释放内存几乎并不意味着实际将内存释放给操作系统。大多数 Python 实现都有多个级别的空闲列表,并且它通常位于 malloc 之类的东西之上。因此,如果您要分配足够的额外内存来增加峰值内存大小,空闲列表上有很多东西可能会阻止这种情况;如果您已经达到顶峰,则发布值不太可能产生任何影响。(并且假设峰值内存使用量对您的应用程序很重要 - 仅仅因为它是迄今为止最容易衡量的事情并不意味着它与每个问题最相关。)
在几乎所有现实生活中的代码中,这都不太可能产生任何影响。如果是这样,您将需要进行测试并了解诸如内存压力和缓存位置之类的因素如何影响您的应用程序。您可能正在使您的代码更好,您可能会使它变得更糟(至少假设某些特定的内存测量不是您关心优化的唯一事情),很可能您没有任何效果,而是让它更长,因此更少可读。这是格言“过早优化是万恶之源”的一个完美例子。