Python深入一點的理解

###Python的垃圾回收###
Python的垃圾回收採用引用計數,絕大部分對象都通過這種方式處理。這種方式優點是直觀,實現簡單,將回收消耗均攤到程序運行過程中(因爲用計數法當計數爲0時可以立即回收)。缺點是執行效率低,還有一個致命問題,就是會產生循環引用,導致無法回收,這就和內存泄漏一樣嚴重了,Java放棄了使用它。Python採用一定的方式來彌補它,叫做標記-清除法
標記,清除法
對於引用記數法沒有排除的對象,在需要的時候,就採用標記-清除法來處理。
Python會採用某種方式來對循環引用進行摘除。先將能夠引用其他對象的對象稱爲容器,Python先將所有未清除的容器的引用的拷貝一份到一個雙向鏈表中,然後遍容器,然後進入尋找他們對其他對象的應用,找到一個就將改對象的被引用數減一,並且這樣遞歸處理整棵引用樹。最後那些循環引用就會被摘除。此時,就可以回收引用數=0的對象了。
貌似Python的這個處理並不會很及時有效,還是需要手動處理和避免。
分代回收
程序對象的生命週期長度也滿足二八定律,少量對象生命週期很長,很大部分生命週期短。有相關的研究表明面向對象的不管哪種程序設計語言,哪種應用都滿足這種規律。回收時,長的大概率還要用,新的大概率不用,故可以分代,將長的劃分到一代,低頻回收,創建不就或短的高頻回收,留存下來的加到長生命週期帶中。
對垃圾回收進行相關的設置,調優
GC模塊中提供相應的接口、支持。
調優方法:
手動垃圾回收,關閉垃圾回收,然後需要是主動調用。比如遊戲過程中不回收,遊戲結束或者非關鍵操作過程中回收。或者關鍵過程中關閉,非關鍵過程在開啓。
調高垃圾回收閾值
手動處理引用相關
避免循環引用,手動解除循環引用,使用弱引用(通過weakref),Python還提供查找循環引用的工具。

執行Python代碼的是解釋器,這對應於Java有虛擬機.虛擬機的定義有2個,一種是類似Vmware的系統虛擬機,另一種是虛擬機稱之爲程序虛擬機,諸如JVM,CLR就是最常見到的虛擬機。

PyCodeObject和pyc文件。
P有CodeObject也就是Python的字節碼文件,當python程序第一次運行時,Python根據.py文件會生成PyCodeObject,並保存到內存當中,以供使用,當Python程序運行結束時,Python解釋器則將PyCodeObject到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,如果找到,則直接載入,否則就重複上面的過程。
所以我們應該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實是PyCodeObject的一種持久化保存方式。pyc的目的主要是緩存加速,不過這個對大部分的Python開發者都沒必要了解,還是想多了Q^Q.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章