python - 定期删除 Python 良好做法中的长字典/列表?

标签 python

我一直在写一个很长的脚本,偶尔会构建大型字典和/或列表,我想知道在我使用完它们后是否可以通过使用 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/

相关文章:

python - 具有功能的自定义异常

python - 将子字符串的第一个实例与正则表达式匹配

python - 获取最长重复字符串的索引

python - 如何使用 BeautifulSoup 找到特定的视频 html 标签?

python - 将平面列表转换为python中的列表列表

python - celery 无法在 docker 中启动

python - emacs 24 : How do I get back emacs-23 sexp behavior for python mode?

python - 尝试使用Python使用MagickWand方法给图像加水印

python - 在进程之间共享具有文件句柄属性的对象

python - 形状不匹配 : value array of shape X could not be broadcast to indexing result of shape . 。 . X?