[python] 优化内存的方法 - 弱引用weakref

当我们存储、读取大的对象或者文件的时候,该文件或者对象会被多次赋值(或者应用),内存会被占用多次,造成浪费。使用弱引用可以解决。
官方文档点这里

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值