一、Python内存管理
Python中,python中,一切都是对象,又分为mutable和immutable对象。二者区分的标准在于是否可以原地修改,“原地”可以理解为相同的地址。可以通过id()查看一个对象的“地址”,如果通过变量修改对象的值,但id没发生变化,那么就是mutable,否则就是immutable。比如:
#immutable
a=1
print(id(a))#140734991946784
a=3
print(id(a))#140734991946848
#mutable
b =[1,2,3]print(id(b))#1273753854536
b.append(4)print(id(b))#1273753854536
1、引用计数
引用计数(References count),指的是每个Python对象都有一个计数器,记录着当前有多少个变量指向这个对象。
通过sys.getrefcount(obj)对象可以获得一个对象的引用数目,返回值是真实引用数目加1(加1的原因是obj被当做参数传入了getrefcount函数),例如:
importsys
s= 1
print(sys.getrefcount(s))#1297
a = 'jkl'
print(sys.getrefcount(a))#4
从中可以看出,Python中的对象缓存池会缓存十分常用的immutable对象,比如整数1。
2、垃圾回收
这里强调一下,本文中的的垃圾回收是狭义的垃圾回收,是指当出现循环引用,引用计数无计可施的时候采取的垃圾清理算法。
在python中,使用标记-清除算法(mark-sweep)和分代(generational)算法来垃圾回收
3、gc module
这里的gc(garbage collector)是Python 标准库,该module提供了与上一节“垃圾回收”内容相对应的接口。通过这个module,可以开关gc、调整垃圾回收的频率、输出调试信息。gc模块是很多其他模块(比如objgraph)封装的基础,在这里先介绍gc的核心API。
import gc
gc.enable()#开启gc(默认开启)
gc.disable()#关闭gc
gc.isenabled()#判断gc是否开启
gc.collect()#执行一次垃圾回收,不管gc是否处于开启状态都能使用