这是一个简单的问题,但由于我没有找到任何答案,我认为答案是否定的。但是,为了确保,我问它:
在我们在函数中完成变量后,是否能使python代码更有效地将变量设置为None
?
以此为例:
def foo(fname):
temp_1, temp_2 = load_file_data(fname)
# do some processing on temp_1, temp_2
temp_1 = None
temp_2 = None
# continue with the rest of the function
如果我们在函数末尾执行此操作,答案是否会改变(因为我假设python本身会在那时执行此操作)?
答案 0 :(得分:14)
这取决于你的意思"更高效"。
将变量设置为None
,假设它们是对其值的唯一引用,将允许垃圾收集器收集它们。在CPython中(它使用垃圾收集器进行ref计数),它甚至可以立即执行。
但另一方面,您还要为解释器必须执行的函数添加更多字节码,这会使代码对象更难保留在缓存中,依此类推。
请记住,释放内存几乎从未意味着实际上将内存释放到操作系统。大多数Python实现都有多个级别的空闲列表,它通常位于malloc
之类的顶部。因此,如果您要分配足够的额外内存来增加峰值内存大小,那么在空闲列表中包含大量内容可能会阻止这种情况;如果你已达到巅峰状态,释放价值不大可能产生任何影响。 (并且假设峰值内存使用量对您的应用程序至关重要 - 只是因为它是迄今为止最简单的测量方法并不意味着它最相关的是什么对每一个问题。)
在几乎所有现实生活中的代码中,这不太可能产生任何不同。如果确实如此,您需要进行测试,并了解内存压力和缓存位置等因素对您的应用程序的影响。你可能会使你的代码变得更好,你可能会使它变得更糟(至少假设某些特定的内存测量并不是你唯一关心优化的东西),很可能你没有任何影响,只是让它变得更长,因此不太可读。这是格言的一个完美例子,过早的优化是所有邪恶的根源"。
如果我们在函数末尾执行此操作,答案是否会改变(因为我假设python本身会在那时执行此操作)?
你是对的,Python在函数返回时释放局部变量。所以,是的,在这种情况下,你几乎没有任何积极因素,几乎所有的负面因素,这可能会改变答案。
但是,除了所有这些警告之外,有些情况下这可以改善一些事情。*所以,如果你已经描述了你的应用程序并发现持有太久的内存导致真正的问题,无论如何,解决它!
尽管如此,请注意del temp_1
会产生与您正在寻找的效果相同的效果,而且您在做什么以及为什么会更明确。在大多数情况下,将代码重构为较小的函数可能会更好,以便temp_1
和朋友在您自然完成后立即超出范围,而无需任何额外的工作
*例如,假设函数的其余部分只是上半部分的精确副本,有三个新值。在免费列表的顶部拥有一套完美的候选人可能比必须更深入地搜索免费列表更好 - 并且肯定比分配更多内存并可能触发交换更好......
答案 1 :(得分:0)
我不同意它会更快,除非你遇到内存不足的情况。
在正常的应用程序中,只要函数中的变量离开作用域,它们就会被标记为不再使用,释放或特定python解释器所做的任何操作。设置为None意味着更多的python工作,因为这将允许变量指向的内存是自由的,但不是变量本身。
另外,一般来说python使用引用计数,而不是垃圾收集,所以一旦引用计数降到零,对象就会自由了。