最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何快速理解python的垃圾回收機制

 更新時間:2020年09月01日 07:47:41   作者:FXL  
在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于如何快速理解python的垃圾回收機制的相關(guān)知識點內(nèi)容,需要的朋友們可以學(xué)習下。

一、先來說說為什么要有垃圾回收

解釋器在執(zhí)行到定義變量得語法時,會申請內(nèi)存空間來存放變量得值,但是由于內(nèi)存空間是有限得,所以這就涉及到了內(nèi)存回收問題了,當一個變量值沒有用了(簡稱垃圾),這種時候就應(yīng)該回收掉這個變量值得內(nèi)存空間。

二、那么什么是垃圾回收機制

垃圾回收機制(簡稱GC)是Python解釋器自帶一種機,專門用來回收不可用的變量值所占用的內(nèi)存空間

三、為什么要用垃圾回收機制呢?

程序運行過程中會申請大量的內(nèi)存空間,而對于一些無用的內(nèi)存空間如果不及時清理的話會導(dǎo)致內(nèi)存使用殆盡(內(nèi)存溢出),導(dǎo)致程序崩潰,因此管理內(nèi)存是一件重要且繁雜的事情,而python解釋器自帶的垃圾回收機制把程序員從繁雜的內(nèi)存管理中解放出來。

四、垃圾回收機制的理解

1、堆區(qū)和棧區(qū)

在定義變量時,變量名與變量值都是需要存儲的,分別對應(yīng)內(nèi)存中的兩塊區(qū)域:堆區(qū)與棧區(qū)。

# 1、變量名與值內(nèi)存地址的關(guān)聯(lián)關(guān)系存放于棧區(qū)
# 2、變量值存放于堆區(qū),內(nèi)存管理回收的則是堆區(qū)的內(nèi)容

2、直接引用和間接引用

直接引用指的是從棧區(qū)出發(fā)直接引用到的內(nèi)存地址。間接引用指的是從棧區(qū)出發(fā)引用到堆區(qū)后,再通過進一步引用才能到達的內(nèi)存地址。

x=10 # 10這個值被變量x直接引用
list=[20,x] # 10這個值被列表list間接引用12

五、垃圾回收機制的原理分析

Python的GC模塊主要運用了“引用計數(shù)”(reference counting)來跟蹤和回收垃圾。在引用計數(shù)的基礎(chǔ)上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產(chǎn)生的循環(huán)引用的問題,并且通過“分代回收”(generation collection)以空間換取時間的方式來進一步提高垃圾回收的效率。

1、引用計數(shù)

變量值被變量名關(guān)聯(lián)得次數(shù)(包括間接引用和直接引用 ),一旦變量得引用計數(shù)得值變成0,占用內(nèi)存就會被回收。

2、引用計數(shù)得問題以及解決方案

問題一:循環(huán)引用

引用計數(shù)機制存在著一個致命的弱點,即循環(huán)引用(也稱交叉引用

list1=[111,]
list2=[222,]
list1.append(list2)
list2.append(list1)
print(list1,list2)
[111, [222, [...]]] [222, [111, [...]]]
#  list1和list2之間相互引用
#  list1=[111的內(nèi)存地址,list2的內(nèi)存地址]
#  list2=[222的內(nèi)存地址,list1的內(nèi)存地址]
x=10
list=[2,3,x]
print(list[2]) # 10
x=123
print(list[2]) # 10

這種時候一旦我們del list1,del list2,刪除列表的直接引用,只剩下list1和list2之間 的相互引用,這樣引用計數(shù)不是0,內(nèi)存空間無法回收,并且無法去到list1和list2的值(就是垃圾),這種時候python引入了“標記-清除” 與“分代回收”來分別解決引用計數(shù)的循環(huán)引用與效率低的問題。

問題二:標記清除

容器對象(比如:list,set,dict,class,instance)都可以包含對其他對象的引用,所以都可能產(chǎn)生循環(huán)引用。而“標記-清除”計數(shù)就是為了解決循環(huán)引用的問題。標記/清除算法的做法是當應(yīng)用程序可用的內(nèi)存空間被耗盡的時,就會停止整個程序,然后進行兩項工作,第一項則是標記,第二項則是清除。

問題三:效率問題

基于引用計數(shù)的回收機制,每次回收內(nèi)存,都需要把所有對象的引用計數(shù)都遍歷一遍,這是非常消耗時間的,于是引入了分代回收來提高回收效率,分代回收采用的是用“空間換時間”的策略。

問題四:分代回收

分代回收的核心思想是:在歷經(jīng)多次掃描的情況下,都沒有被回收的變量,gc機制就會認為,該變量是常用變量,gc對其掃描的頻率會降低分代指的是根據(jù)存活時間來為變量劃分不同等級(也就是不同的代)

新定義的變量,放到新生代這個等級中,假設(shè)每隔1分鐘掃描新生代一次,如果發(fā)現(xiàn)變量依然被引用,那么該對象的權(quán)重(權(quán)重本質(zhì)就是個整數(shù))加一,當變量的權(quán)重大于某個設(shè)定得值(假設(shè)為3),會將它移動到更高一級的青春代,青春代的gc掃描的頻率低于新生代(掃描時間間隔更長),假設(shè)5分鐘掃描青春代一次,這樣每次gc需要掃描的變量的總個數(shù)就變少了,節(jié)省了掃描的總時間,接下來,青春代中的對象,也會以同樣的方式被移動到老年代中。也就是等級(代)越高,被垃圾回收機制掃描的頻率越低

回收依然使用引用計數(shù)作為回收的依據(jù)

問題五:分代回收的缺點

例如一個變量剛剛從新生代移入青春代,該變量的綁定關(guān)系就解除了,該變量應(yīng)該被回收,但青春代的掃描頻率低于新生代,這就到導(dǎo)致了應(yīng)該被回收的垃圾沒有得到及時地清理。

沒有十全十美的方案:

毫無疑問,如果沒有分代回收,即引用計數(shù)機制一直不停地對所有變量進行全體掃描,可以更及時地清理掉垃圾占用的內(nèi)存,但這種一直不停地對所有變量進行全體掃描的方式效率極低,所以我們只能將二者中和。

綜上:

垃圾回收機制是在清理垃圾&釋放內(nèi)存的大背景下,允許分代回收以極小部分垃圾不會被及時釋放為代價,以此換取引用計數(shù)整體掃描頻率的降低,從而提升其性能,這是一種以空間換時間的解決方案目錄。

以上就是如何快速理解python的垃圾回收機制的詳細內(nèi)容,更多關(guān)于你理解python的垃圾回收機制么的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用Python實現(xiàn)一鍵將頭像轉(zhuǎn)成動漫風

    利用Python實現(xiàn)一鍵將頭像轉(zhuǎn)成動漫風

    小編今天將為大家詳細介紹如何利用Python語言制作一個UI界面,大家可以通過一鍵點擊就實現(xiàn)頭像照片轉(zhuǎn)化成動漫風格的功能,感興趣的可以動手嘗試一下
    2022-07-07
  • 怎么用Python識別手勢數(shù)字

    怎么用Python識別手勢數(shù)字

    今天給大家?guī)淼奈恼率窃趺从肞ython識別手勢數(shù)字,文中有非常詳細的圖文示例,對正在學(xué)習python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Python基礎(chǔ)之內(nèi)置模塊詳解

    Python基礎(chǔ)之內(nèi)置模塊詳解

    Python內(nèi)置的模塊有很多,我們也已經(jīng)接觸了不少相關(guān)模塊,接下來咱們就來做一些項目開發(fā)中常用的模塊匯總和介紹,需要的朋友可以參考下
    2021-06-06
  • 如何使用python切換hosts文件

    如何使用python切換hosts文件

    這篇文章主要介紹了如何使用python切換hosts文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-04-04
  • Python多線程結(jié)合隊列下載百度音樂的方法

    Python多線程結(jié)合隊列下載百度音樂的方法

    這篇文章主要介紹了Python多線程結(jié)合隊列下載百度音樂的方法,實例分析了Python多線程及文件下載的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 詳解利用python-highcharts庫繪制交互式可視化圖表

    詳解利用python-highcharts庫繪制交互式可視化圖表

    本文主要和大家分享一個超強交互式可視化繪制工具-python-highcharts。python-highcharts就是使用Python進行Highcharts項目繪制,簡單的說就是實現(xiàn)Python和Javascript之間的簡單轉(zhuǎn)換層,感興趣的可以了解一下
    2022-03-03
  • Python抓包程序mitmproxy安裝和使用過程圖解

    Python抓包程序mitmproxy安裝和使用過程圖解

    這篇文章主要介紹了Python mitmproxy包安裝和使用過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-03-03
  • Python?第三方opencv庫實現(xiàn)圖像分割處理

    Python?第三方opencv庫實現(xiàn)圖像分割處理

    這篇文章主要介紹了Python?第三方opencv庫實現(xiàn)圖像分割處理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • python中的全局變量與局部變量解讀

    python中的全局變量與局部變量解讀

    這篇文章主要介紹了python中的全局變量與局部變量用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Scrapy基于selenium結(jié)合爬取淘寶的實例講解

    Scrapy基于selenium結(jié)合爬取淘寶的實例講解

    今天小編就為大家分享一篇Scrapy基于selenium結(jié)合爬取淘寶的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06

最新評論

兴义市| 灌云县| 安平县| 河西区| 庄浪县| 吉林省| 盘山县| 仲巴县| 南澳县| 龙海市| 库车县| 游戏| 泉州市| 武川县| 巴彦淖尔市| 安庆市| 和顺县| 利川市| 沅江市| 巴彦淖尔市| 高安市| 广南县| 辽宁省| 克拉玛依市| 万山特区| 城口县| 牡丹江市| 嘉峪关市| 渭源县| 利辛县| 武威市| 阿勒泰市| 津市市| 清镇市| 白水县| 永年县| 郎溪县| 尤溪县| 涪陵区| 广宁县| 连平县|