当我们存储、读取大的对象或者文件的时候,该文件或者对象会被多次赋值(或者应用),内存会被占用多次,造成浪费。使用弱引用可以解决。
官方文档点这里
Python的垃圾回收机制:
简单一句话——当a赋值到列表b中,id相等。a变了,b里的不变。
于是,当一个很大的文件赋值n次后,当他被垃圾回收以后,其他的不会被回收。造成内存被大量占用!
使用方法:
超级简单
b = weakref.ref(a)
举个例子:
假设有一个类BigObject,是需要读取占内存很大的文件到data_loader中,最后赋值到loader_ref中。
import weakref
class BigObject:
def __init__(self, name, size):
self.name = name
self.size = size
def __call__(self, *args, **kwargs):
print(f'I am {self.name} this size of my is {self.size}')
data_loader = BigObject(name='image-set', size=1e9)
loader_ref = data_loader
# 当删除data_loader时
del data_loader
loader_ref()
# 即使删除data_loader,loader_ref()依然存在
# ----------- 使用weakref ----------- #
data_loader = BigObject(name='image-set', size=1e9)
loader_ref = weakref.ref(data_loader)
print(loader_ref() is data_loader)
# 已经赋值,会显示True
# 释放data_loader
del data_loader
print(loader_ref())
# loader_ref() 就会变为空 None
## assignment
data_loader = BigObject(name='image-set', size=1e9)
loader_ref = weakref.ref(data_loader)
print(loader_ref() is data_loader)
# 同理,当data_loader被重新赋值时
data_loader = 1
print(loader_ref())
# loader_ref() 也会变为空 None