python 內存管理

1.小整數和短小的字符,Python都會緩存這些對象,以便重複使用,例子:python

>>> id(1)
13323368
>>> id(1)
13323368
>>> id(2)
13323344
>>> id(22222222222222222222)
139875920755688
>>> id(22222222222222222222)
139875920755648

2. 爲了檢驗兩個引用指向同一個對象,咱們能夠用is關鍵字。is用於判斷兩個引用所指的對象是否相同,緩存

    

>>> a=[1,2,3]
>>> b=[1,2,3]
>>> id(a)
139875920663904
>>> id(b)
139875920664768
>>> a is b
False
>>>

3.在Python中,每一個對象都有存有指向該對象的引用總數,即引用計數(reference count)。函數

咱們能夠使用sys包中的getrefcount(),來查看某個對象的引用計數。須要注意的是,當使用某個引用做爲參數,傳遞給getrefcount()時,參數實際上建立了一個臨時的引用。所以,getrefcount()所獲得的結果,會比指望的多1spa

>>> import sys 
>>> a='1234'
>>> b='1234'
>>> a is b 
True
>>> sys.getrefcount(a)
3
>>> del a
>>> sys.getrefcount(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> sys.getrefcount(b)
2
>>>

4.容器對象的引用可能構成很複雜的拓撲結構。咱們能夠用objgraph包來繪製其引用關係,好比debug

x = [1, 2, 3]
y = [x, dict(key1=x)]
z = [y, (x, y)]import objgraph
objgraph.show_refs([z], filename='ref_topo.png')

objgraph是Python的一個第三方包。安裝以前須要安裝xdot。調試

sudo apt-get install xdot
sudo pip install objgraph

5,垃圾回收機制 (計數器,標記清除(循環引用),分代收集)
code

6,有 __del__() 函數的對象間的循環引用是致使內存泄漏的主兇orm

$ time python yourprogram.py
 
real    0m1.028s
user    0m0.001s
sys     0m0.003s

objgraph 對象的連接圖,而且顯示咱們的python程序裏佔用內存最多的前N個對象
import gc  
import objgraph  
### 強制進行垃圾回收  
gc.collect()  
### 打印出對象數目最多的 50 個類型信息  
objgraph.show_most_common_types(limit=50)

line_profiler和memory_profiler 執行的對象內存

用PDB庫調試Python程序
gc.set_debug(gc.DEBUG_LEAK)
import profile
相關文章
相關標籤/搜索