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

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

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

[[314349]]

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

我们举个例子:

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

 

  1. 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,就是用来处理这种情况的。

我们来看看如何使用它:

 

  1. import weakref 
  2. class Panda: 
  3.     def __init__(self, name): 
  4.         self.name = name 
  5.      
  6.     def walk(self): 
  7.         print('我是一只熊猫,正在走路'
  8.  
  9. class Tiger: 
  10.     pass 
  11.  
  12.  
  13. class Monkey: 
  14.     pass 
  15. panda = Panda('xyz'
  16. tiger = Tiger() 
  17. Monkey = Monkey() 
  18.  
  19.  
  20. weak_dict = weakref.WeakValueDictionary() 
  21. weak_dict['Panda'] = panda 
  22. weak_dict['Tiger'] = tiger 
  23. weak_dict['Monkey'] = moneky 

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

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

责任编辑:华轩 来源: 未闻Code
相关推荐

2013-09-16 16:48:50

Android优化软引用

2014-07-03 09:39:34

Java内存分析mat工具

2013-08-19 17:14:04

.Net强引用弱引用

2009-06-16 11:26:22

弱引用内存泄露

2020-06-17 14:10:01

Python内存程序

2020-12-02 09:01:40

Java基础

2021-12-09 15:45:09

Python弱引用代码

2010-07-22 11:09:33

SQL Server内

2021-10-08 21:00:52

数据弱引用对象

2015-11-02 17:20:00

Java弱引用

2024-05-20 08:58:13

Java引用类型垃圾回收器

2021-01-07 14:20:55

JavaGC

2022-01-02 06:55:08

Node.js ObjectWrapAddon

2020-06-23 09:48:09

Python开发内存

2018-11-16 16:10:28

JavaOOM编程语言

2022-10-30 13:21:58

谷歌Chrome浏览器

2017-11-15 19:30:08

Python内存泄露循环引用

2020-05-31 18:08:15

Python数据技术

2021-01-15 06:54:54

Python内存程序

2009-06-19 16:19:23

Java对象引用
点赞
收藏

51CTO技术栈公众号