首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定期删除Python中的长字典/列表?

定期删除Python中的长字典/列表?
EN

Stack Overflow用户
提问于 2013-03-13 03:45:59
回答 3查看 1.2K关注 0票数 6

我一直在写一个很长的脚本,偶尔会构建大的字典和/或列表,我想知道当我使用完它们时,是否可以通过使用del删除它们来提高性能。或者,将这些对象留在周围,由垃圾回收来处理,这是正常的做法吗?这里的最佳实践是什么?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-13 03:57:21

del不等同于free(3)。它不会强制Python释放内存。它可能根本不会释放内存。您应该避免将其与内存使用完全关联。

del所做的唯一一件事就是从其作用域中删除一个名称。(或从集合中删除项目,或删除属性。但我认为这不是您在这里讨论的内容。)

实际上,这就是:

代码语言:javascript
复制
del foo

等同于:

代码语言:javascript
复制
del LOCAL_SCOPE['foo']

所以这不会释放任何内存:

代码语言:javascript
复制
massive_list = list(range(1000000))
same_massive_list = massive_list
del massive_list

它所要做的就是去掉massive_list这个名字。底层对象仍然有另一个名称same_massive_list,因此它不会消失。del不是控制Python内存管理的秘密钩子;它只是请求Python调用其内存管理的几种方法之一。

(顺便说一下,CPython是重新计数+循环收集的,而不是垃圾收集的。一旦对对象的最后一个引用消失,对象就会立即被释放。垃圾不会到处躺着等着被清理。当然,其他实现做了不同的事情;例如,PyPy是垃圾回收的。)

现在,如果您使用的名称是列表/字典/其他名称的唯一名称,那么del肯定会使其引用计数降为零,因此它将被释放。但是,因为del的语义实际上是关于删除名字的,所以我不会在这种情况下使用它。我只是让变量退出作用域(如果可行),或者将名字重新分配给一个空白列表,或者None,或者任何对你的程序有意义的东西。你甚至可以就地清空列表,即使同一个列表有几个名字也可以:

代码语言:javascript
复制
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的唯一地方是在类或模块作用域中,在那里我暂时需要一些helper值,但真的不想将其公开为API的一部分。这真的很少见,但这是我遇到的唯一一种我真正想要“删除这个名字”的语义的情况。

票数 10
EN

Stack Overflow用户

发布于 2013-03-13 03:53:01

del通常不是必需的。

在CPython中,当没有对对象的引用时,对象就消失了。del只会删除对该对象的一个引用;如果还有其他对该对象的引用,它将保留不变,而del实际上并没有改善您的内存状况。

相反,简单地将变量重新分配给不同的对象(例如,在循环的顶部创建一个新的空列表)也将减少对该对象的一个引用,隐式地执行与del相同的操作。如果此时没有对该对象的其他引用,它将立即被释放。

还要记住,当函数返回时,局部变量就消失了,所以您不需要显式地del函数中定义的任何名称。

一个例外是循环引用,其中两个(或更多)对象相互引用,但实际上都不能通过名称访问;Python定期对这些对象进行垃圾回收,但如果在处理完对象后打破循环,则可以更快地释放它们。(这可能只需要一个del!)然而,在这种情况下,这可能是相当罕见的。

在IronPyothon (运行在JVM上)或Jython (运行在.NET上)中,最佳内存管理策略可能有所不同,因为使用的是底层VM的垃圾收集器。

票数 2
EN

Stack Overflow用户

发布于 2013-03-13 04:27:44

Python的优势之一(与C等语言相比)是,一般来说,您不必担心内存管理的细节,而可以专注于程序的目的。

因此,我的建议是,除非你有理由这样做(例如,python正在吞噬你所有的RAM),否则就不要麻烦了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15370703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档