python 内存管理

原创 2015年07月07日 18:15:37

简介

python 的内存分配和回收都是自动的,用户不需要在代码中申请或释放内存。python的内存管理有两个策略,引用计数和垃圾回收。

引用计数

python内部记录了每个对象有多少个引用,即引用计数(ob_refcnt),用来跟踪对象。当对象创建是,引用计数为1。

引用计数增加

有四种方式可以增加对象的引用计数:
1,对象创建:ob = "testnewstrob"
2,对象引用赋值:ob_ref = ob
3,调用func( ob)
4,作为容器对象的一个元素,例如obs = [ob]

引用计数减少

1,对象名被显示销毁:例如 del ob
2,本地引用离开它的作用域:例如 func(ob)执行结束
3,对象的一个别名被赋值其他:例如 ob = "othervalue"
4,从容器中移除,例如obs.remove(ob)
5,包含对象引用的容器被删除,例如 del obs
可以通过getrefcount 查看引用计数,通过getrefcount看到的引用计数比实际多1,因为对象作为getrefcount函数的参数,属于增加一次引用。


当对象的引用计数为0时,表示该对象可以被回收。python中引用计数已经补充了垃圾收集,所以可以实现资源回收。但是基于引用计数的内存管理存在一个明显的问题,就是无法解决循环引用的垃圾回收。

a=[]
b=[]
a.append(b)
b.append(a)
del a
del b

由于存在循环引用,导致引用计数最后非0

垃圾回收

python 提供gc (garbage collect) 模块,解决循环应用等产生的垃圾。根据gc module的官方文档中介绍,如果用户能确定代码中不存在循环引用,甚至可以关闭gc(gc.disable())。
gc垃圾回收不同于引用计数,是根据对象是否可被访问(reachable)判断对象是否是垃圾。
a = []
b = a
del a
del b
gc.collect()



上图所示,gc.collect()并不是用来回收普通的对象析构。对于循环引用的垃圾,python使用gc实现垃圾回收。

a = []
b = []
a.append(b)
b.append(a)
del a
del b
gc.collect()



资源释放

有一些垃圾对象,gc发现其unreachable,但是不能自动删除(uncollectable)。包括一些循环引用,python不能自动判断其调用__del__()的顺序,导致无法自动free。这些对象放在gc.garbage的列表中,用户可以通过del gc.garbage[:]删除。

分代回收

python在进行垃圾回收时会终止其他任务,频繁的垃圾回收会降低python执行效率。为此python引入分代回收:在python运行过程中记录分配对象次数和回收对象次数,当二者差值超过某个阈值,会触发垃圾回收。这个阈值可以通过gc模块查看(700)。同时,python认为存在时间越长的对象成为垃圾的机会越小,将所有对象分成0,1,2三代。上图两个10代表每执行10次0代回收执行一次1代回收,没执行10次1代回收执行1次2代回收。

总结

一直对python gc存有疑惑,查了一些资料整理了一下,有错误的地方欢迎指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Python 内存管理

为提升执⾏行性能,Python 在内存管理上做了⼤大量⼯工作。最直接的做法就是⽤用内存池来减少操作系 统内存分配和回收操作,那些⼩小于等于 256 字节对象,将直接从内存池中获取存储空间。 根据需...

python内存管理

起因春节期间,翻了翻《垃圾回收的算法和实现》,真是一本好书。时间比较短还没有完全看完。但是让我吃惊的时候,这是一本将垃圾回收的书,但是在它的实现篇里居然对python的内存管理有比较深入的讲解。今天有...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

python内存管理

不断更新 1.手动释放内存import gc del obj_name gc.collection()2.pandas read_csv()技巧 最近在参加一个比赛,意外发现直接用pd.read_...

python内存管理

一 与C语言的对比 先来看看C语言的一段函数: #include int main() { int a = 1; int b = 1; int c = b; ...

python内存管理机制

2.1 Python是如何进行内存管理的? 2015-07-19 16:15 <span cla...

python的内存管理

python中的内存管理是通过引用计数和垃圾回收模块实现。 一般情况下python在堆中new出来的对象都是通过引用计数来管理的,当引用计数为0的时候,就会立即通过tp_dealloc方法释放对象。注...

Python内存管理说明

#coding=utf8 ''' 变量和内存管理细节: 1、变量无须事先声明 2、变量无须指定类型 3、程序员不用关心内存管理 4、变量名会被"回收" 5、del语句能够直接释放资源 ''' from...

Python的内存管理

语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、面向对象的...

Python内存管理机制

一、python内存 因为要调用while循环,循环内有temp变量,不清楚python是否会在每一轮循环结束后自动释放temp内存空间,做了一个内存测试,发现无论temp = none,还是del ...
  • ztf312
  • ztf312
  • 2015-08-27 11:21
  • 1022

Python的内存管理

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)