Python記憶體管理機制

2021-08-11 10:57:52 字數 2834 閱讀 2133

一、python記憶體

因為要呼叫while迴圈,迴圈內有temp變數,不清楚python是否會在每一輪迴圈結束後自動釋放temp記憶體空間,做了乙個記憶體測試,發現無論temp = none,還是del temp,只能銷毀變數,無法完全釋放記憶體空間。注:紅色部分標出相同記憶體id。

[python]view plain

copy

>>> 

fori 

inrange(

3):  

temp = i  

print

temp,id(temp)  

0 36666732

1 36666720

2 36666708

[python]view plain

copy

>>> 

fori 

inrange(4,

7):  

"white-space:pre"

>    temp = i  

"white-space:pre"

>    

print

temp,id(temp)  

"white-space:pre"

>    temp = 

none

4 36666684

5 36666672

6 36666660

[python]view plain

copy

>>> 

fori 

inrange(7,

10):  

temp = i  

print

temp,id(temp)  

deltemp  

7 36666648

8 36666636

9 36666624

[python]view plain

copy

>>> a = 

1>>> id(a)  

36666720

[python]view plain

copy

>>> b = 

5>>> id(b)  

36666672

[python]view plain

copy

>>> c = 

8>>> id(c)  

36666636

測試完畢後刪除c可以看到,變數c和temp確實被銷毀,只是他們指向的引用值仍然會在記憶體中存在。直至視窗關閉才自動釋放,人工無法干預。

[plain]view plain

copy

>>> del c  

[plain]view plain

copy

>>> id(c)  

traceback (most recent call last):  

file "", line 1, in 

id(c)  

nameerror: name 'c' is not defined  

>>> id(temp)  

traceback (most recent call last):  

file "", line 1, in 

id(temp)  

nameerror: name 'temp' is not defined  

>>> id(5)  

36666672  

>>> id(10)  

36666612  

>>> id(100000)  

41708736  

>>> id("1234")  

46118528  

>>> d = "1234"  

>>> id(4)  

36666684  

二、記憶體池機制

檢視了相關的部落格,更深一步了解python記憶體機制

python的記憶體機制以金字塔行,-1,-2層主要有作業系統進行操作,

第0層是c中的malloc,free等記憶體分配和釋放函式進行操作;

第1層和

第2層是記憶體池,有python的介面函式pymem_malloc函式實現,當物件小於256k時有該層直接分配記憶體;

第3層是最上層,也就是我們對python物件的直接操作;

在 c 中如果頻繁的呼叫 malloc 與 free 時,是會產生效能問題的.再加上頻繁的分配與釋放小塊的記憶體會產生記憶體碎片. python 在這裡主要幹的工作有:

如果請求分配的內存在1~256位元組之間就使用自己的記憶體管理系統,否則直接使用 malloc.

這裡還是會呼叫 malloc 分配記憶體,但每次會分配一塊大小為256k的大塊記憶體.

經由記憶體池登記的記憶體到最後還是會**到記憶體池,並不會呼叫 c 的 free 釋放掉.以便下次使用.

對於簡單的python物件,例如數值、字串,元組(tuple不允許被更改)採用的是複製的方式(深拷貝?),也就是說當將另乙個變數b賦值給變數a時,雖然a和b的記憶體空間仍然相同,但當a的值發生變化時,會重新給a分配空間,a和b的位址變得不再相同

而對於像字典(dict),列表(list)等,改變乙個就會引起另乙個的改變,也稱之為淺拷貝

python記憶體管理機制

a 1整數1為乙個物件。而a是乙個引用。利用賦值語句,引用a指向物件1。在python中,整數和短小的字元,python都會快取這些物件,以便重複使用。當我們建立多個等於1的引用時,實際上是讓所有這些引用指向同乙個物件。a 1 b 1 print id a print id b 在python中,每...

python記憶體管理機制

1.引用計數 當乙個python物件被引用時 其引用計數增加 1 當其不再被變數引用時 引用計數減 1 當物件引用計數等於 0 時,物件被刪除 引用計數是一種非常高效的記憶體管理機制 2.垃圾 垃圾 機制 引用計數 標記清除 分帶 引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的...

Python記憶體管理機制

由於python中萬物皆物件,所以python的儲存問題是物件的儲存問題,並且對於每個物件,python會分配一塊記憶體空間去儲存它 注意 變數名沒有型別,型別屬於物件 因為變數引用物件,所以型別隨物件 變數引用什麼型別的物件,變數就是什麼型別的。a 123 b a print id a print...