引用计数
每个对象记录被变量绑定(引用)的数量,当为0时被销毁。
a = "悟空" #引用计数增加1
b = a #引用计数增加1
c = b #引用计数增加1
del a #引用计数减少1
b = "八戒" #引用计数减少1
c = None #引用计数减少1
#悟空因为引用计数为零,所以被销毁。
- 缺点:对循环引用无效
(循环引用对象无法被销毁)
list01 = []
list02 = []
list01.append(list02)
list01.append(list01)
del list01,list02
标记清除
- 缺点:全盘扫描内存,计算量大。
分代回收
将内存划分为多个区域(代),当内存不足时,进行升代操作,将有用的数据,转移到下一代,垃圾数据数据清空。由于分代,所以避免了全盘扫描。
内存优化
- 尽少产生垃圾
- 对象池
- 设置分代回收参数
尽少产生垃圾
str_result = ""
for i in range(100):
str_result += str(i) #持续拼接创建新内存。
改为 【对不可变对象的频繁修改,要改为对可变对象的修改。】
#对不可变对象的频繁修改,要改为对可变对象的修改。
list_result = []
for i in range(100):
list_result.append(str(i) )
对象池
- 减少重复对象的存在
- 减少对象的创建与销毁的过程
data01 = "齐天大圣"
data02 = "齐天大圣"
print(id(data01),id(data02))