gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:30:23 25 4
gpt4 key购买 nike

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

在函数中处理完变量后,将变量设置为 None 是否会使 Python 代码更高效?

举个例子:

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 之类的东西之上。因此,如果您要分配足够的额外内存来增加峰值内存大小,那么在空闲列表中有很多东西可能会阻止这种情况;如果您已经达到了顶峰,那么发布值不太可能产生任何影响。 (假设内存使用峰值对您的应用很重要——仅仅因为它是迄今为止最容易衡量的东西,并不意味着它与每个问题最相关。)

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


Does the answer change if we do this at the end of the function (since I assume python itself would do it at that point)?

你说得对,Python 在函数返回时释放了局部变量。所以是的,在这种情况下,你仍然会得到几乎所有的否定,而几乎没有得到肯定,这可能会改变答案。


但是,除了所有这些注意事项之外,在某些情况下,这可能会有所改善。* 因此,如果您已经分析了您的应用并发现持有该内存的时间过长会导致真正的问题,那么一定要修复它!

不过,请注意,del temp_1 将产生您正在寻找的相同效果,并且您正在做什么以及为什么要更明确。在大多数情况下,将代码重构为更小的函数可能会更好,这样 temp_1 和 friend 会在你自然地完成它们后立即离开范围,而无需任何额外的工作。

* 例如,假设函数的其余部分只是前半部分的精确副本,具有三个新值。在空闲列表的顶部拥有一组完美的候选者可能比必须更深入地搜索空闲列表要好——而且绝对比必须分配更多内存并可能触发交换要好……

关于python - 在 python 中将变量设置为 `None` 是否更节省内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com