首頁 後端開發 Python教學 python是如何進行記憶體管理的

python是如何進行記憶體管理的

Jun 21, 2019 am 10:14 AM
python記憶體管理

python是如何進行記憶體管理的

Python引進了一個機制:引用計數,來進行管理記憶體。

python內部使用引用計數,來保持追蹤記憶體中的對象,Python內部記錄了物件有多少個引用,即引用計數,當物件被創建時就創建了一個引用計數,當當物件不再需要時,這個物件的參考計數為0時,它被垃圾回收。

總結一下物件會在以下情況下引用計數加1:

#1.物件被建立:x=4

2.另外的別人被創建:y=x

3.被當作參數傳遞給函數:foo(x)

4.作為容器物件的一個元素:a=[1,x,'33' ]

引用計數減少情況

#1.一個本地引用離開了它的作用域。例如上面的foo(x)函數結束時,x指向的物件參照減1。

2.物件的別名被明確的銷毀:del x ;或del y

3.物件的一個別名被賦值給其他物件:x=789

# 4.物件從一個視窗物件中移除:myList.remove(x)

5.視窗物件本身被銷毀:del myList,或是視窗物件本身離開了作用域。

垃圾回收

1、當記憶體中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然後清除其在記憶體的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清除:當兩個物件互相引用時,他們本身其他的引用已經為0了。

2、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用物件(a引用b, b引用a, 導致其參考計數永遠不會為0)。

在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請後,很快又會被釋放,由於這些內存的申請並不是為了創建對象,所以併沒有物件一級的記憶體池機制。這意味著Python在運作期間會大量執行malloc和free的操作,頻繁地在使用者態和核心態之間進行切換,這將嚴重影響Python的執行效率。為了加速Python的執行效率,Python引入了一個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

記憶體池機制

Python提供了對記憶體的垃圾收集機制,但它將不使用的內存放到記憶體池而不是傳回給作業系統。

Python中所有小於256個位元組的物件都使用pymalloc實作的分配器,而大的物件則使用系統的 malloc。另外Python對象,如整數,浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用來快取這些整數的記憶體就不能再分配給浮點數。

以上是python是如何進行記憶體管理的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? 如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? 在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? 如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何繞過Investing.com的反爬蟲機制獲取新聞數據? 如何繞過Investing.com的反爬蟲機制獲取新聞數據? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

See all articles