我一直在写一个很长的脚本,偶尔会构建大型字典和/或列表,我想知道在我使用完它们后是否可以通过使用 del
删除它们来提高性能。还是让这些对象闲置以由垃圾收集处理是正常的做法吗?这里的最佳做法是什么?谢谢。
最佳答案
del
不等同于 free(3)。它不会强制 Python 释放内存。它可能根本不会释放内存。您应该避免将它与内存使用完全联系起来。
del
所做的唯一一件事就是从其作用域中删除一个名称。 (或者从集合中删除一个项目,或者删除一个属性。但我认为这不是你在这里谈论的。)
实际上,这:
del foo
等同于:
del LOCAL_SCOPE['foo']
所以这不会释放任何内存:
massive_list = list(range(1000000))
same_massive_list = massive_list
del massive_list
...因为它所做的只是删除name massive_list
。底层对象还有另一个名称 same_massive_list
,因此它不会消失。 del
不是控制 Python 内存管理的 secret 钩子(Hook);这只是要求 Python 调用其内存管理的几种方法之一。
(顺便说一句,CPython 是引用计数 + 循环收集,而不是垃圾收集。对象立即一旦对它们的最后引用消失就被释放。垃圾不会四处等待清理。当然,其他实现做不同的事情;例如,PyPy 是垃圾收集器。)
现在,如果您使用的名称是列表/字典/其他的唯一名称,那么del
肯定会导致其引用计数降为零,因此它会被释放的。 但是,因为del
的语义实际上是关于删除名称,所以我不会在这种情况下使用它。我只是让变量退出范围(如果可行),或者将名称重新分配给空白列表,或者 None
,或者任何对您的程序有意义的名称。您甚至可以就地清空列表,即使同一个列表有多个名称也可以使用:
foo = list(range(1000000))
bar = foo
foo[:] = []
# Both `bar` and `foo` still refer to the original list, but now it's empty
您可以使用 d.clear()
对字典执行相同的操作。
我唯一会在名称上使用 del
的地方是在类或模块范围内,我暂时需要一些辅助值,但真的不想要将其公开为 API 的一部分。这确实很少见,但这是我遇到过的唯一一种我真正想要“删除此名称”语义的情况。
关于python - 定期删除 Python 良好做法中的长字典/列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15370703/