繁体   English   中英

在python中将变量设置为“None”是否更节省内存?

[英]Is it more memory-efficient to set variables to `None` in python?

这是一个简单的问题,但由于我没有找到任何答案,我认为答案是否定的。 但是,为了确保,我问它:

在我们在函数中完成变量后,它是否使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本身会在那时执行此操作)?

这取决于你的意思是“更有效率”。

将变量设置为None ,假设它们是对其值的唯一引用,将允许垃圾收集器收集它们。 在CPython(它使用垃圾收集器的ref计数),它甚至会立即这样做。

但另一方面,您还要为解释器必须执行的函数添加更多字节码,这会使代码对象更难保留在缓存中,依此类推。

请记住,释放内存几乎从未意味着实际上将内存释放到操作系统。 大多数Python实现都有多个级别的空闲列表,它通常位于像malloc这样的东西之上。 因此,如果您要分配足够的额外内存来增加峰值内存大小,那么在空闲列表中包含大量内容可能会阻止这种情况; 如果你已达到巅峰状态,释放价值不太可能产生任何影响。 (并且假设峰值内存使用对您的应用程序至关重要 - 只是因为它是迄今为止最简单的测量方法并不意味着它与每个问题最相关。)

在几乎所有现实代码中,这不太可能产生任何不同。 如果是这样,您将需要进行测试,并了解内存压力和缓存位置等因素对您的应用程序的影响。 你可能会使你的代码变得更好,你可能会使它变得更糟(至少假设某些特定的内存测量并不是你唯一关心优化的东西),很可能你没有任何效果,只是让它更长,因此更少可读。 这是“过早优化是万恶之源”这句格言的完美典范。


如果我们在函数末尾执行此操作,答案是否会改变(因为我假设python本身会在那时执行此操作)?

你是对的,Python在函数返回时释放局部变量。 所以,是的,在这种情况下,你几乎所有的负面影响几乎没有任何积极因素,这可能会改变答案。


但是,除了所有这些警告之外,有些情况下这可以改善一些事情。*所以,如果你已经描述了你的应用程序,并发现持有太久的内存导致真正的问题,无论如何,修复它!

不过,请注意del temp_1将具有您正在寻找的相同效果,并且它在您正在做的事情和原因方面更明确。 在大多数情况下,将代码重构为较小的函数可能会更好,这样temp_1和朋友一旦自然完成就会超出范围,而无需任何额外的工作。

*例如,假设函数的其余部分只是上半部分的精确副本,具有三个新值。 在免费列表的顶部拥有一套完美的候选人可能比必须更深入地搜索自由列表更好 - 并且肯定比分配更多内存并可能触发交换更好...

我不同意它会更快,除非你遇到内存不足的情况。

在正常的应用程序中,只要函数中的变量离开作用域,它们就会被标记为不再使用,释放或者特定python解释器所做的任何操作。 设置为None意味着更多的python工作,因为这将允许变量指向的内存是空闲的,而不是变量本身。

此外,一般来说python使用引用计数,而不是垃圾收集,所以一旦引用计数降到零,对象就会被释放。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM