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,或者窗口對象自己離開了做用域。 ③垃圾回收 再也不被使用的內存會被一種稱爲垃圾收集的機制釋放。 注: 垃圾回收機制負責釋放內存, 垃圾收集器是一塊獨立代碼, 它用來尋找引用計數爲0的對象,而後清除其在內存的空間。它也負責檢查雖然引用計數大於0可是也應該被銷燬的對象,好比:當兩個對象相互引用時,他們自己其餘的引用已經爲0了。 ④內存池機制 Python的內存機制以金字塔行,-1,-2層主要有操做系統進行操做,   第0層是C中的malloc,free等內存分配和釋放函數進行操做;   第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存; 第3層是最上層,也就是咱們對Python對象的直接操做; python中的內存管理機制都有兩套實現,一套是針對小對象,就是大小小於256bits時,pymalloc會在內存池中申請內存空間;當大於256bits,則會直接執行new/malloc的行爲來申請內存空間。 當建立大量消耗小內存的對象時,頻繁調用new/malloc會致使大量的內存碎片,導致效率下降。內存池的概念就是預先在內存中申請必定數量的,大小相等 的內存塊留做備用,當有新的內存需求時,就先從內存池中分配內存給這個需求,不夠了以後再申請新的內存。這樣作最顯著的優點就是可以減小內存碎片,提高效率。 淺拷貝和深拷貝。數值、字符串,元組(tuple不容許被更改)採用的是複製的方式(深拷貝?),也就是說當將另外一個變量B賦值給變量A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會從新給A分配空間,A和B的地址變得再也不相同。而對於像字典(dict),列表(List)等,改變一個就會引發另外一個的改變,也稱之爲淺拷貝。
相關文章
相關標籤/搜索