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