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