棧記憶體區【stack】:用於直接分配資料,訪問數度較快,資料儲存不穩定,適用於小資料塊的快速訪問,一般在程式中用於儲存變數資料。
方法區【data】:主要用於引導程式中的**資料、二進位制資料、方法資料等等程式執行需要的預載入資料
靜態區【static】:主要用於載入儲存程式中的一些靜態資料、常量資料等等,在python中的不可變資料型別的資料也會儲存在靜態常量區記憶體中
堆記憶體【heap】:儲存資料穩定持久,一般用於儲存載入較為重量級的資料,如程式執行過程中的物件都是存在堆記憶體中的
一般的基本資料型別都是不可變型別
python中的一切都是物件,可以通過id()函式查詢物件在記憶體中的位址資料,不可變資料型別是在定義了資料之後,修改變數的資料,變數不會修改原來記憶體位址的資料而是會指向新位址,原有的資料保留,這樣更加方便程式中基本資料的利用率。
用python賦值皆標籤的理念理解一下:
b=a: b標籤和a標籤一樣 貼在位址為8791523976080的值上
此時b還是貼在」位址8791523976080」上
同理分析num[4]
發現原來 「4」這個常亮就是存在「位址8791523976112」中,
所以num[3]應該還是貼」位址8791523976080」
果然:
再看乙個加深理解:
對於不可變型別,
在同乙個**塊中進行多次使用時會將該型別的物件,直接建立在常量區,在任意引用時候的時候直接賦值記憶體位址因為不可變型別的物件資料不會發生變化,所以記憶體中儲存乙份即可!優化程式執行效率一般情況下,可變型別的物件會建立在堆記憶體中;不可變型別的物件會建立在常量區記憶體中
整數型別:-5~256:在直譯器載入時,已經自動分配了這些數字的記憶體
超出-5~256範圍的整數,在乙個**塊中申請一次記憶體
(注:互動模式:一行命令就是乙個**塊,ide模式~工具開發:乙個模組就是乙個**塊)
一般的組合資料型別或者自定義資料型別都是可變資料型別,可變型別是在定義過資料型別之後,修改變數的資料,記憶體位址不會發生變化。
所以就出現了淺拷貝和深拷貝這一說:
上圖 list_b=list_a就是賦值。
淺拷貝: copy.copy(影子拷貝)
深拷貝:copy.deepcopy
如果淺拷貝或深拷貝,則應該在堆記憶體中新建一片區域用於儲存乙個一模一樣的列表
舉個簡單的例子:
import
copya=
[1,2
,3,4
,["a"
,"b"]]b
=ac=
copy
.copy(a
)print(c
isa)print(id
(c))print(id
(a))print(id
(a[4
]))print(id
(c[4
]))d
=copy
.deepcopy(a
)print(id
(d[4
]))a.(
5)a[
4].(
"c")
print(a
)print(b
)print(c
)print(d
)
執行結果如下:
而deepcopy則是完全複製,和原物件沒有一丁點聯絡了。
python 記憶體分析 python 記憶體分析
1 改原始碼重新編譯列印相關資訊 obmalloc.c 檔案中列印 maxarenas,值為當前環境分配 arena 個數 分配 arena 時並沒有馬上分配對應的pools,故對於每乙個 arena,nfreepools 和 ntotalpools 為分配pool的可用pool數和總pool數。i...
物件的簡單記憶體分析
1.我們先來建立乙個person類 import inte ce dcperson nsobject void eat void walk end 很簡單,就沒有寫注釋了。首先是建立乙個dcperson類,這個類有兩個屬性,age和name。同時有兩個方法,分別是 void eat和 void wa...
python 記憶體分析 python記憶體管理分析
記憶體管理,對於python這樣的動態語言,是至關重要的一部分,它在很大程度上甚至決定了python的執行效率,因為在python的執行中,會建立和銷毀大量的物件,這些都涉及到記憶體的管理。小塊空間的記憶體池 在python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被...