打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python如何管理内存?

介绍

内存管理是有效分配,重新分配和协调内存的过程,以便所有不同的进程都能平稳运行并可以最佳地访问不同的系统资源。内存管理还涉及清除不再访问的对象的内存。

在Python中,内存管理器通过定期运行以清理,分配和管理内存来负责此类任务。与C,Java和其他编程语言不同,Python通过使用引用计数来管理对象。这意味着内存管理器会跟踪对程序中每个对象的引用数。当对象的引用计数降至零(这意味着不再使用该对象)时,垃圾回收器(内存管理器的一部分)会自动从该特定对象释放内存。

用户不必担心内存管理,因为内存的分配和取消分配过程是全自动的。回收的内存可以由其他对象使用。

Python垃圾回收

如前所述,Python删除程序中不再引用的对象以释放内存空间。Python释放不再使用的内存块的过程称为垃圾收集。Python 垃圾收集器(GC)在程序执行期间运行,如果引用计数减少为零,则将触发Python 垃圾收集器。如果为对象分配了新名称或将其放置在诸如元组或字典之类的容器中,则引用计数会增加。同样,当重新分配对对象的引用,对象的引用超出范围或删除对象时,引用计数也会减少。

内存是一个堆,其中包含程序中使用的对象和其他数据结构。此堆空间的分配和取消分配由Python内存管理器通过使用API函数控制。

内存中的Python对象

Python中的每个变量都充当一个对象。对象可以是简单的(包含数字,字符串等),也可以是容器(字典,列表或用户定义的类)。此外,Python是一种动态类型化的语言,这意味着我们无需在程序中使用它们之前就声明变量或其类型。

例如:

如果看上面程序的前两行,对象x是已知的。当我们删除对象x并尝试使用它时,会收到一条错误消息,指出x未定义变量。

您会看到Python中的垃圾回收是完全自动化的,并且程序员无需担心,与C之类的语言不同。

修改垃圾收集器

Python垃圾收集器具有三代对象分类。生命周期起点的一个新对象是第一代垃圾收集器。随着对象在垃圾回收中幸存下来,它将被提升到下一代。3代垃圾收集器中的每一个都有一个阈值。具体地说,当超过分配数量的阈值减去解分配数量时,该生成将运行垃圾回收。

与上一代相比,前几代也更经常收集垃圾。这是因为较新的对象比旧的对象更有可能被丢弃。

该gc模块包括更改阈值,手动触发垃圾收集过程,禁用垃圾收集过程等功能。我们可以使用以下get_threshold()方法检查不同代垃圾收集器的阈值:

样本输出:(700, 10, 10)

如您所见,这里第一代的门槛为700,其他两代的门槛为10。

我们可以使用模块的set_threshold()方法来更改触发垃圾收集过程的阈值gc:

gc.set_threshold(900, 15, 15)

在上面的示例中,我们增加了所有3代的阈值。增加阈值将减少运行垃圾收集器的频率。通常,作为开发人员,我们无需过多考虑Python的垃圾回收,但这在为目标系统优化Python运行时时可能很有用。关键好处之一是Python的垃圾回收机制自动为开发人员处理了许多底层细节。

为什么要执行手动垃圾收集?

我们知道Python解释器会跟踪对程序中使用的对象的引用。在Python的早期版本(直到1.6版)中,Python解释器仅使用引用计数机制来处理内存。当引用计数降至零时,Python解释器会自动释放内存。这种经典的引用计数机制非常有效,只是当程序具有引用周期时它无法工作。如果一个或多个对象相互引用,则会发生一个引用循环,因此引用计数永远不会达到零。

让我们考虑一个例子。

上面的代码创建了一个引用循环,其中对象list引用了自身。因此,list当函数返回时,对象的内存将不会自动释放。参考循环问题无法通过参考计数来解决。但是,可以通过更改Python应用程序中垃圾回收器的行为来解决此参考周期问题。

为此,我们可以使用模块的gc.collect()功能gc。

结论

在本文中,我们讨论了如何通过使用引用计数和垃圾回收策略来自动处理Python中的内存管理。没有垃圾回收,就不可能在Python中实现成功的内存管理机制。另外,程序员不必担心删除已分配的内存,因为Python内存管理器会注意这一点。这样可以减少内存泄漏并提高性能。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python的内存管理
大话 Python:python 进阶提升 -- 如何理解垃圾回收机制及应用
Python垃圾回收机制
python变量的内存机制
《源码探秘 CPython》94. Python 的引用计数与标记-清除
C/C++中几种经典的垃圾回收算法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服