Python 如何实现高性能(浅谈垃圾回收!)
什么是垃圾回收: 垃圾回收实际上调用的是析构方法 __del__
简而言之指的是删除引用
1,对象被创建
2,对象被引用
3,对象被作为参数
4,对象作为一个元素存放在一个容器之中都会使引用增加1。
相反,
1,对象的别名被显式销毁
2,对象的别名被赋予新的对象
3,一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4,对象所在的容器被销毁,或从容器中删除对象
a = 3 #a对象被创建,引用加1(针对于3来说)
b = a #a 对象被赋值,引用加1
del a # a 的引用减去1,3不会被清理,以另一种形式而存在。
这只是不是容器的情况下。如果对象是容器的情况下,那么就会有另一种情况!
python 垃圾回收机制的缺陷(针对容器而言)
1,目前版本的 Python 采用引用计数的方式来管理分配的内存。
2,Python 的每个对象都有一个引用计数,这个引用计数表明了有多少对象在指向它,当这个引用计数为 0 时,该对象就释放了。
3,引用计数对于多数程序都工作地很好,然而,引用计数有一个本质上的缺陷,是由于循环引用引起的.
li_ =[] # 增加引用1
li_.append(li_) #自己引用自己,增加引用1
del li_ #删除引用减去1
但是在实际内存中,这个列表 li 永远不会释放.(只是针对引用计数而言)
传统的垃圾回收工作方式是什么呢?
先从根目录寻找对象,找得到的就会被标记为活跃状态,并且释放其他对象。
由于扩展模块的工作方式(牵扯到c ),Python 不能完全地确定根对象集合。如果根对象集合没法被准确地确定,我们就有释放仍然被引用的对象的风险。
那么如何做呢?如何去完全释放干净对象内存呢?
一种解决方式是通过双向链表的方式,将每个容器都用链表穿起来,通过链表能访问的,都是活跃的对象,相反也可以定位不活跃的对象集合.
但是真的是这么吗?会不会造成浪费呢?
答案是肯定的!