離高薪測試你可能只差這個理解:python 內存管理機制

近期有小伙伴跟我反饋 ,面試有遇到面試官問 python 內存管理機制相關的問題,因為之前沒有特地的去了解過,所以不知道怎么回答。

所以今天就專門寫了這篇 python 內存管理機制的文章,來給大家系統的梳理一下內存管理機制的知識點,以及面試中容易被問到的問題。

通過這篇文章幫你們輕松通關面試中 python 內存管理機制相關的問題。

01、引用計數機制

引用計算機制是咱們 python 中垃圾回收的主要機制,python 解釋器會根據對象的引用計數是否為零,來對進行垃圾回收,釋放內存。接下來我們先來看看什么是引用計數。

如果你想學習自動化測試,我這邊給你推薦一套視頻,這個視頻可以說是B站播放全網第一的接口自動化測試教程,同時在線人數到達1000人,并且還有筆記可以領取及各路大神技術交流:798478386????

【已更新】B站講的最詳細的Python接口自動化測試實戰教程全集(實戰最新版)_嗶哩嗶哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

我們先來看一個最簡單的 python 賦值語句

>>> a = 10

這邊給變量 a 賦值了一個數值類型的對象 10, 那么在內存中存儲的時候,a 這個變量指向的是 10 這個對象,此時 10 這個對象的引用計算會加 1。

>>> b=a

當我們再把 a 賦值給變量 b 時,b 引用的也是 a 這個變量引用的值 10,那么這個時候 10 這個對象的引用計數又會加 1。

引用計數增加:

● 對象被創建

● 對象被別的變量引用(賦值給一個變量)

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

引用計數減少:

●? 對象的別名被顯式的銷毀

●? 對象的一個別名被賦值給其他對象 (例:比如原來的 a=10,被改成 a=100,那么此時 10 的引用計數就減少了)

●? 對象從容器中被移除,或者容器被銷毀(例:對象從列表中被移除,或者列表被銷毀)

●??一個引用離開了它的作用域(調用函數的時候傳進去的參數,在函數運行結束后,該參數的引用即被銷毀)

引用計數查看

咱們如果要查看對象的引用計數,可以通過內置模塊 sys 提供的 getrefcount 方法去查看。

import sys
obj =[11,22,33]
print(sys.getrefcount(obj))

注意點:當使用某個引用作為參數,傳遞給 getrefcount()時,參數實際上創建了一個臨時的引用。因此,getrefcount()所得到的結果,會比期望的多 1 ;對應一些常用的基本數據看到的引用計數值會比較大(因為 python 內部引用)

02、數據池和緩存

1、小整數池

a=1000
a1=1000
b = 10
b1 = 10
# a和a1是否為同一個對象?,b和b1是否為同一個對象?

?問題:a 和 a1 是否為同一個對象?,b 和 b1 是否為同一個對象?

答案:?b 和 b1 是同一個對象,a 和 a1 不是

為什么會出現上述情況呢?

當運行 python 程序時,Python 自動將-5~256 的整數進行了緩存,放在一個‘池’(小整數池)中,無論程序中那些變量指向這些范圍內的整數或者字符串當你將這些整數賦值給變量時,并不會重新創建對象,而是使用已經創建好的緩存對象。

優點:對于一些常用的整數,直接從‘池’里拿來用,避免頻繁的創建和銷毀,提升效率,節約內存

2、intern 機制

intern 機制,也稱為字符串駐留池,是針對于字符串內存管理的一種優化處理的機制。

In [4]: s1='abc'
In [5]: s2 ='abc'
In [6]: s2 is s2
Out[6]: TrueIn [7]: s3='abc?'
In [8]: s4 = 'abc?'
In [9]: s3 is s4
Out[9]: False
#為什么會出現這種情況,同樣是字符串為什么上面兩次賦值,是同一個對象,下面不是。

intern 機制的優點是,在創建新的字符串對象時(如果字符串只包含數字、字母、下劃線),會先在字符串駐留池里面找是否有已經存在的值相同的對象,如果有,則直接拿過來用(引用),避免頻繁的創建和銷毀內存,提升效率。

3、緩存機制

● float、int 、list 等一些內置的數據類型,會緩存 80 個對象

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

● 其他的自定義類型一般都是緩存 2 個對象

03、垃圾回收機制

● python 的垃圾回收機制用一句話來形容就是:引用計數機制為主,標記-清除和分代收集兩種機制為輔的策略

1、引用計數

● 引用計數:在之前講對象的引用我們講到了,每個對象創建之后都有一個引用計數,當引用計數為 0 的時候,那么此時的的垃圾回收機制會自動把它銷毀,回收內存空間。

● 引用計數存在一個缺點那就是當兩個對象出現循環引用的時候,那么這個兩個變量始終不會被銷毀,這樣就會導致內存泄漏。

2、標記清除:

首先標記對象(垃圾檢測),然后清除垃圾(垃圾回收),首先初始所有對象標記為白色,并確定根節點對象(這些對象是不會被刪除),標記它們為黑色(表示對象有效),將有效對象引用的對象標記為灰色(表示對象可達,但它們所引用的對象還沒檢查),檢查完灰色對象引用的對象后,將灰色標記為黑色。重復直到不存在灰色節點為止。最后白色結點都是需要清除的對象。

?3、分代回收

分代回收是一種以空間換時間的操作方式,Python 將內存根據對象的存活時間劃分為不同的集合,每個集合稱為一個代,Python 將內存分為了 3“代”,分別為年輕代(第 0 代)、中年代(第 1 代)、老年代(第 2 代),他們對應的是 3 個鏈表,它們的垃圾收集頻率隨著對象存活時間的增大而減小。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207575.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

訪問控制技術

訪問控制是在身份認證的基礎上,根據不同身份的用戶對用戶的訪問請求加以限制。身份認證關心的是“你是誰,你是否擁有你所聲明的身份”這個問題;而訪問控制則關心“你能做什么,不能做什么”的問題。 在訪問控制過程中,一…

1.查看表的基本結構,表的詳細結構和修改表名

查看表的基本結構,表的詳細結構和修改表名 1.查看數據表基本結構 有強迫癥或健忘癥的小伙伴們在建好數據庫和表以后,通常會懷疑自己剛才是不是敲錯了,怎么辦?如果不是使用圖形界面是不是就沒法查看啦? 不存在的,這就…

大創項目推薦 醫學大數據分析 - 心血管疾病分析

文章目錄 1 前言1 課題背景2 數據處理3 數據可視化4 最后 1 前言 🔥 優質競賽項目系列,今天要分享的是 🚩 基于大數據的心血管疾病分析 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! &#x1f9…

給Flask加上百度翻譯功能,這樣可以用中文進行搜索了

上一篇博客:Flask之手搓bootstrap翻頁-CSDN博客 里,對 OMDb API - The Open Movie Database 的搜索,只能使用英文,才能搜索出電影信息,如果使用中文,是搜索不到結果的。這里就需要使用翻譯,把中…

剪映最新版的4.9,主要更新的功能(于2023年12月2日發布)

新增“多軌道音頻”功能:用戶可以將多個音頻軌道疊加在一起,并對每個音頻軌道進行單獨的編輯。這使得用戶可以更靈活地控制視頻的音頻效果。新增“音頻調音”功能:用戶可以使用音頻調音功能對視頻的音頻進行調節,包括音量、音調、…

QString::arg()函數用法(數字前補零)

QString中的arg方法類似于 (1)“C中的printf中使用的格式輸出符”和 (2)“C中string的append方法”的結合體。 常用的兩種格式如下: 1. 用于填充字符串中的%1,%2…為給定的參數。 //原型: QString QString::arg(const QString & a1) &#xff08…

多功能智能遙測終端機 5G/4G+北斗多信道 視頻采集傳輸

計訊物聯多功能智能遙測終端機,全網通5G/4G無線通信、弱信號地區北斗通信,多信道自動切換保障通信聯通,豐富網絡接口及行業應用接口,支持水利、環保、工業傳感器、控制終端、智能終端接入,模擬量/數字量/信號量采集&am…

camera2對攝像頭編碼h264

MediaCodec編碼攝像頭數據 前置:保存的一些成員變量 // 攝像頭開啟的 handler private Handler cameraHandler; // Camera session 會話 handler private Handler sessionHandler; //這里是個Context都行 private AppCompatActivity mActivity; // 這個攝像頭所有需…

深入理解 Python 中的 eval 函數

更多資料獲取 📚 個人網站:ipengtao.com eval 是 Python 中一個強大而靈活的函數,它允許將字符串作為代碼執行。然而,由于其潛在的安全風險,使用時需要謹慎。本文將深入探討 eval 函數的各個方面,包括基本…

delphi/python 實現小紅書xhs用戶作品列表和圖片/視頻無水印解析

技術學習,請勿用與非法用途!!! 成品圖用戶作品列表接口 /api/sns/web/v1/user_posted?num30&cursor&user_id642bf0850000000011022c4e&image_scenes http Get方式,請求頭需要帶上x-s x-t簽名驗證筆記明細…

直流負載箱的技術發展趨勢和創新有哪些?

直流負載箱廣泛應用于電子、通信、航空航天等領域,隨著科技的不斷發展,直流負載箱也在不斷創新和改進,直流負載箱在負載電流和電壓的測量方面要求高精度和高穩定性。未來的發展趨勢是提高負載箱的測量精度和穩定性,以滿足更高要求…

記錄一些好的文章

高效編寫可維護代碼: 如何高效編寫可維護代碼? | 菜鳥教程 (runoob.com)

計算平均分并輸出低于平均分的學生成績

從鍵盤上輸入若干&#xff08;<20&#xff09;個學生的成績&#xff0c;統計計算出平均成績&#xff0c;并輸出低于平均分的學生成績&#xff0c;用輸入負數結束輸入。 輸入格式: 在一行中輸入若干&#xff08;<20&#xff09;個學生的實型成績&#xff0c;用輸入負數結…

uniapp 使用 $emit和$on——$on中無法為data中的變量賦值

問題在于this的指向&#xff0c; 解決辦法是使用變量保存$on&#xff0c;其次再為data中的值賦值 以下是具體代碼&#xff1a; 1、html代碼&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Git

第1章 Git 概述 Git 是一個免費的、開源的分布式版本控制系統&#xff0c;可以快速高效地處理從小型到大型的各種項目。 Git 易于學習&#xff0c;占地面積小&#xff0c;性能極快。 它具有廉價的本地庫&#xff0c;方便的暫存區域和多個工作流分支等特性。其性能優于 Subversi…

系統設計之數據庫

為您的項目選擇正確的數據庫是一項復雜的任務。許多數據庫選項都適合不同的用例&#xff0c;很快就會導致決策疲勞。 我們希望這份備忘單提供高級指導&#xff0c;以找到符合您項目需求的正確服務并避免潛在的陷阱。 注意&#xff1a;Google 關于其數據庫用例的文檔有限。盡管…

軟件測試卷王的自述,我難道真的很卷?

前言 前段時間去面試了一個公司&#xff0c;成功拿到了offer&#xff0c;薪資也從12k漲到了18k&#xff0c;對于工作都還沒兩年的我來說&#xff0c;還是比較滿意的&#xff0c;畢竟一些工作3、4年的可能還沒我高。 我可能就是大家說的卷王&#xff0c;感覺自己年輕&#xff…

北郵22級信通院數電:Verilog-FPGA(12)第十二周實驗(2)彩虹呼吸燈(bug已解決 更新至3.0)

北郵22信通一枚~ 跟隨課程進度更新北郵信通院數字系統設計的筆記、代碼和文章 持續關注作者 迎接數電實驗學習~ 獲取更多文章&#xff0c;請訪問專欄&#xff1a; 北郵22級信通院數電實驗_青山如墨雨如畫的博客-CSDN博客 目錄 一.代碼部分 1.1一些更新和講解 1.2改正后的…

解密HubSpot CMS Hub:構建引人入勝的企業網站!

在數字化時代&#xff0c;網站是企業與客戶互動的重要窗口。為了在競爭激烈的市場中脫穎而出&#xff0c;企業需要一個現代化、用戶友好且高度可定制的網站。而HubSpot CMS Hub作為一款領先的內容管理系統&#xff0c;為企業提供了獨特的優勢&#xff0c;讓網站建設變得更加輕松…

Private Set Intersection from Pseudorandom CorrelationGenerators 最快PSI!導覽解讀

目錄 一、概述 二、相關介紹 三、性能對比 四、技術細節 1.KKRT 2.Pseudorandom Correlation Generators 3.A New sVOLE-Based BaRK-OPRF 4.BaRK-OPRF 五、總結 參考文獻 一、概述 這篇文章的主要脈絡和核心思想是探討如何利用偽隨機相關生成器&#xff08;PCG&#…