自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用弱引用優(yōu)化 Python 程序的內(nèi)存占用?

開發(fā) 后端
Python 的垃圾回收機(jī)制通過引用計(jì)數(shù)來(lái)決定一個(gè)對(duì)象要不要被回收。當(dāng)一個(gè)對(duì)象被引用次數(shù)為0時(shí),它就會(huì)被作為垃圾回收從而釋放 Python 內(nèi)存。

 Python 的垃圾回收機(jī)制通過引用計(jì)數(shù)來(lái)決定一個(gè)對(duì)象要不要被回收。當(dāng)一個(gè)對(duì)象被引用次數(shù)為0時(shí),它就會(huì)被作為垃圾回收從而釋放 Python 內(nèi)存。

[[314349]]

但有些情況下,我們的代碼可能在不經(jīng)意間導(dǎo)致某些實(shí)際上我們不再使用的對(duì)象的引用計(jì)數(shù)始終大于0,從而無(wú)法被垃圾回收。

我們舉個(gè)例子:

很多人喜歡使用字典來(lái)存放一些數(shù)據(jù),假設(shè)我現(xiàn)在有一個(gè)字典是這樣的:

 

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

其中monkey_obj, tiger_obj, panda_obj都是對(duì)象。在我們的程序中,可能會(huì)傳入不同的字符串來(lái)讀取不同的對(duì)象。當(dāng)我們把這些對(duì)象放進(jìn)字典中的時(shí)候,它的引用計(jì)數(shù)已經(jīng)被+1了。

但是,panda_obj這個(gè)對(duì)象比較特殊,它只會(huì)在程序運(yùn)行的早期被查出來(lái)使用1次。之后就再也不會(huì)使用了。

但由于這個(gè)對(duì)象被放在字典里面,所以這個(gè)對(duì)象的引用計(jì)數(shù)始終大于0,Python 的垃圾回收機(jī)制就會(huì)認(rèn)為這個(gè)對(duì)象還會(huì)被使用,于是它就會(huì)始終占用內(nèi)存。

在數(shù)據(jù)處理領(lǐng)域或者圖像處理領(lǐng)域,經(jīng)常會(huì)出現(xiàn)字典的值占用大量?jī)?nèi)存的情況,這種情況就會(huì)導(dǎo)致內(nèi)存的浪費(fèi)。

為了解決這種情況,我們可以使用 Python 自帶的weakref模塊,它里面有一個(gè)WeakValueDictionary,就是用來(lái)處理這種情況的。

我們來(lái)看看如何使用它:

 

  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 就像使用普通的字典一樣。但賦值時(shí),值的引用計(jì)數(shù)不會(huì)改變。

這樣當(dāng)我們?cè)谄渌胤絼h除panda這個(gè)字典時(shí),就不會(huì)由于字典占用了一個(gè)引用計(jì)數(shù)而導(dǎo)致無(wú)法被垃圾回收問題。

責(zé)任編輯:華軒 來(lái)源: 未聞Code
相關(guān)推薦

2013-09-16 16:48:50

Android優(yōu)化軟引用

2014-07-03 09:39:34

Java內(nèi)存分析mat工具

2013-08-19 17:14:04

.Net強(qiáng)引用弱引用

2009-06-16 11:26:22

弱引用內(nèi)存泄露

2020-06-17 14:10:01

Python內(nèi)存程序

2020-12-02 09:01:40

Java基礎(chǔ)

2010-07-22 11:09:33

SQL Server內(nèi)

2021-12-09 15:45:09

Python弱引用代碼

2021-10-08 21:00:52

數(shù)據(jù)弱引用對(duì)象

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開發(fā)內(nèi)存

2022-10-30 13:21:58

谷歌Chrome瀏覽器

2018-11-16 16:10:28

JavaOOM編程語(yǔ)言

2021-01-15 06:54:54

Python內(nèi)存程序

2017-11-15 19:30:08

Python內(nèi)存泄露循環(huán)引用

2020-05-31 18:08:15

Python數(shù)據(jù)技術(shù)

2009-06-19 16:19:23

Java對(duì)象引用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)