专栏首页未闻Code一日一技:如何使用弱引用优化 Python 程序的内存占用?

一日一技:如何使用弱引用优化 Python 程序的内存占用?

Python 的垃圾回收机制通过引用计数来决定一个对象要不要被回收。当一个对象被引用次数为0时,它就会被作为垃圾回收从而释放 Python 内存。

但有些情况下,我们的代码可能在不经意间导致某些实际上我们不再使用的对象的引用计数始终大于0,从而无法被垃圾回收。

我们举个例子:

很多人喜欢使用字典来存放一些数据,假设我现在有一个字典是这样的:

animal = {'Monkey': monkey_obj, 'Tiger': tiger_obj, 'Panda': panda_obj}

其中monkey_obj, tiger_obj, panda_obj都是对象。在我们的程序中,可能会传入不同的字符串来读取不同的对象。当我们把这些对象放进字典中的时候,它的引用计数已经被+1了。

但是,panda_obj这个对象比较特殊,它只会在程序运行的早期被查出来使用1次。之后就再也不会使用了。

但由于这个对象被放在字典里面,所以这个对象的引用计数始终大于0,Python 的垃圾回收机制就会认为这个对象还会被使用,于是它就会始终占用内存。

在数据处理领域或者图像处理领域,经常会出现字典的值占用大量内存的情况,这种情况就会导致内存的浪费。

为了解决这种情况,我们可以使用 Python 自带的weakref模块,它里面有一个WeakValueDictionary,就是用来处理这种情况的。

我们来看看如何使用它:

import weakref
class Panda:
    def __init__(self, name):
        self.name = name
    
    def walk(self):
        print('我是一只熊猫,正在走路')

class Tiger:
    pass


class Monkey:
    pass
panda = Panda('xyz')
tiger = Tiger()
Monkey = Monkey()


weak_dict = weakref.WeakValueDictionary()
weak_dict['Panda'] = panda
weak_dict['Tiger'] = tiger
weak_dict['Monkey'] = moneky

使用 weak_dict 就像使用普通的字典一样。但赋值时,值的引用计数不会改变。

这样当我们在其他地方删除panda这个字典时,就不会由于字典占用了一个引用计数而导致无法被垃圾回收问题。

本文分享自微信公众号 - 未闻Code(itskingname),作者:kingname

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一日一技:如何更好地理解归并排序?

    在昨天的文章里面,我们已经知道,可以使用 heapq.merge把两个有序列表合并成新的有序列表。

    青南
  • 一日一技:XPath『不包含』应该怎么写?

    如果能够实现,抓取 class="post"这个 div标签下的文本和除了 class="quote"以外的所有子节点的文本就好了。

    青南
  • 【一日一技】超简单的Pandas数据筛选方法

    {'name': '王小一', 'hight': 171, 'weight': 100},

    青南
  • 移动web开发问题和优化小结

    到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏领域。用户要求越来越高,网站功能越来越好,效果越来越炫酷,这...

    守候i
  • LAMP环境搭建小结

    1. 为什么下载源码包需要到官网上去下载? 简单说就是为了安全,如果是非官方下载的源码包,有可能被别有用心的人动过手脚,毕竟是源码的,任何人都可以修改代码。 ...

    老七Linux
  • 强大的JS方法Object.defineProperty详解及VUE.JS双向绑定原理

    我们知道对象是由多个键/值对组成的无序集合。对象当中的属性可以是任意类型的值。我们可以通过构造函数以及字面量的形式来定义对象。

    用户1272076
  • Django-admin组件

    py3study
  • Webpack中hash与chunkhash的区别,以及js与css的hash指纹解耦方案

    文件的hash指纹通常作为前端静态资源实现增量更新的方案之一,Webpack是目前最流行的开源编译工具之一,其强大的功能也带来很多坑(当然,大部分麻烦其实都可以...

    寒月十八
  • HTTP数据包头部格式解读1

    HTTP协议的大部分功能其实通过其协议包头来实现。因为HTTP协议包头作用如此重要,因此需要单独列出一节来详细讲解。协议包头大体上分为4类,分别为通用包头,请求...

    望月从良
  • 虎嗅主站盲打成功(已进后台)

    简要描述: 是时候展示XSS的威力了! 详细说明: 0x01 先跑个题.. code 区域 WooYun: 虎嗅主站设计缺陷导致弱密码用户风险 这个撞库漏...

    逸鹏

扫码关注云+社区

领取腾讯云代金券