欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python超詳細講解內存管理機制

 更新時間:2022年06月28日 10:04:18   作者:henry_rhy  
本章主要介紹Pyhon的內存管理,以Pyhon的計數機制作為引入,介紹Pyhon的內存管理方式,感興趣的朋友來看看吧

什么是內存管理機制

python中創(chuàng)建的對象的時候,首先會去申請內存地址,然后對對象進行初始化,所有對象都會維護在一

個叫做refchain的雙向循環(huán)鏈表中,每個數據都保存如下信息:

 1. 鏈表中數據前后數據的指針
 2. 數據的類型
 3. 數據值
 4. 數據的引用計數
 5. 數據的長度(list,dict..)

一、引用計數機制

引用計數增加:

1.1 對象被創(chuàng)建

1.2 對象被別的變量引用(另外起了個名字)

1.3 對象被作為元素,放在容器中(比如被當作元素放在列表中)

1.4 對象被當成參數傳遞到函數中

import sys
a = [11,22]        # 對象被創(chuàng)建
b = a             # 對象被別的變量引用
c = [111,222,333,a]        # 對象被作為元素,放在容器中
# 獲取對象的引用計數
print(sys.getrefcount(a))     # 對象被當成參數傳遞到函數中

最后的執(zhí)行結果是,a 這個變量被引用了4次

引用計數減少:

  • 對象的別名被顯式的銷毀
  • 對象的一個別名被賦值給其他對象 (例:比如原來的a=10,被改成a=100,此時10的引用計數就減少了)
  • 對象從容器中被移除,或者容器被銷毀(例:對象從列表中被移除,或者列表被銷毀)
  • 一個引用離開了它的作用域(調用函數的時候傳進去的參數,在函數運行結束后,該參數的引用即被銷毀)
import sys
del b      # 對象的別名被顯式的銷毀
b = 999        # 對象的一個別名被賦值給其他對象
del c      # 列表被銷毀(容器被銷毀)
c.pop()    # 把列表數據最后一個刪除掉(對象從容器中被移除)

二、數據池和緩存

數據池分為兩種:小整數池 和 大整數池

小整數池(-5到256之間的數據)

運行機制:Python自動將 -5~256 的整數進行了緩存到一個小整數池中,當你將這些整數賦值給變量時,并不會重新

創(chuàng)建對象,而是使用已經創(chuàng)建好的緩存對象,當刪除這些數據的引用時,也不會進行回收

超出-5到256的整數將不會在在緩存,會重新創(chuàng)建對象

例如:

對于超出-5到256的整數將不會在在緩存,Python會重新創(chuàng)建對象,返回id

# 場景1:數據為列表,不在-5~256 的范圍
>>> a = [11]
>>> b = [11]
>>> id(a),id(b)
(1693226918600, 1693231858248)       ========》 id 不一樣
# 場景二: 數據為整數,在-5~256 的范圍
>>> aa = 11
>>> bb = 11
>>> id(aa),id(bb)
(140720470385616, 140720470385616)    id 一樣
# 場景三: 數據不在-5~256的范圍
>>> bb = -7
>>> aa = -7
>>> id(aa),id(bb)
(1843518717904, 1843518717776)      id 不一樣
# 場景四: 數據不在-5~256的范圍
>>> a = 257
>>> b = 257
>>> id(a),id(b)
(2092420910928, 2092420911056)      id 不一樣

大整數池(字符串駐留池 / intern機制)

優(yōu)點:在創(chuàng)建新的字符串對象時,會先在緩存池里面找是否有已經存在的值相同的對象(標識符,即只包含數字、字母、下劃線的字符串),如果有,則直接拿過來用(引用),避免頻繁的創(chuàng)建和銷毀內存,提升效率

例如:

對于不在標識符內的數據將不會在在緩存,Python會重新創(chuàng)建對象,返回id

# 場景1:
>>> a = '123adsf_'
>>> b = '123adsf_'
>>> id(a),id(b)
(61173296, 61173296)        ========》 id 一樣
# 場景二: 
>>> b1 = '123adsf_?'
>>> b2 = '123adsf_?'
>>> id(b1),id(b2)
(61173376, 61173416)        id 不一樣

緩存機制

對于python中常用內置數據類型的緩存:

float:緩存100個對象

list: 80個對象

dict: 80個對象

set: 80個對象

元組:會根據元組數據的長度,分別緩存元組長度為0-20的對象

到此這篇關于Python超詳細講解內存管理機制的文章就介紹到這了,更多相關Python內存管理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決Pycharm中恢復被exclude的項目問題(pycharm source root)

    解決Pycharm中恢復被exclude的項目問題(pycharm source root)

    今天小編就為大家分享一篇解決Pycharm中恢復被exclude的項目問題(pycharm source root),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 解決python 在for循環(huán)并且pop數組的時候會跳過某些元素的問題

    解決python 在for循環(huán)并且pop數組的時候會跳過某些元素的問題

    這篇文章主要介紹了解決python 在for循環(huán)并且pop數組的時候會跳過某些元素的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python圖像處理之模糊圖像判斷

    Python圖像處理之模糊圖像判斷

    這篇文章主要為大家詳細介紹了Python圖像處理中的模糊圖像判斷的實現,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-12-12
  • Python matplotlib繪制餅狀圖功能示例

    Python matplotlib繪制餅狀圖功能示例

    這篇文章主要介紹了Python matplotlib繪制餅狀圖功能,結合實例形式分析了Python使用matplotlib模塊進行數值運算與餅狀圖繪制相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • Bottle框架中的裝飾器類和描述符應用詳解

    Bottle框架中的裝飾器類和描述符應用詳解

    這篇文章主要介紹了Bottle框架中的裝飾器類和描述符應用詳解,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Python連接es之es更新操作示例詳解

    Python連接es之es更新操作示例詳解

    這篇文章主要為大家介紹了Python連接es之es更新操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 使用python+Flask實現日志在web網頁實時更新顯示

    使用python+Flask實現日志在web網頁實時更新顯示

    日志是一種可以追蹤某些軟件運行時所發(fā)生事件的方法,下面這篇文章主要給大家介紹了關于使用python+Flask實現日志在web網頁實時更新顯示的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Python驗證碼截取識別代碼實例

    Python驗證碼截取識別代碼實例

    這篇文章主要介紹了Python驗證碼截取識別代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Python從MP3文件獲取id3的方法

    Python從MP3文件獲取id3的方法

    這篇文章主要介紹了Python從MP3文件獲取id3的方法,實例分析了Python操作文件屬性的相關技巧,需要的朋友可以參考下
    2015-06-06
  • Python是編譯運行的驗證方法

    Python是編譯運行的驗證方法

    這篇文章主要介紹了Python是編譯運行的驗證方法,本文講解了一個小方法來驗證Python是編譯運行還是解釋運行,需要的朋友可以參考下
    2015-01-01

最新評論