本節書摘來自異步社群《python高性能程式設計》一書中的第2章,第2.10節,作者[美] 戈雷利克 (micha gorelick),胡世傑,徐旭彬 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
guppy項目有一個記憶體堆的調查工具叫作heapy,可以讓你檢視python堆中對象的數量以及每個對象的大小。當你需要知道某一時刻有多少對象被使用以及它們是否被垃圾收集時,你尤其需要這種深入解釋器内部去了解記憶體中實際内容的能力。如果你受困于記憶體洩漏(可能由于你的對象的引用隐藏于一個複雜系統中),那麼這個工具能幫你找到問題的關鍵點。
當你在審查你的代碼,看它是否如你預期那樣生成對象時,你會發現這個工具非常有用——結果很可能令你吃驚,并為你帶來新的優化方向。
為了使用heapy,你需要用指令pip install guppy安裝guppy包。
例2-12的代碼是julia代碼的一個略有修改的版本。calc_pure_python使用了堆對象hpy,我們在三個地方列印堆的内容。
例2-12 用heapy檢視代碼運作時對象數量的變化
例2-13的輸出顯示了記憶體的使用在建立zs和cs清單後變得有趣:它增長了大約80mb,因為2000000個複數對象消耗了64000000位元組。這些複數對象占據了目前使用的大多數記憶體。如果你想要優化這個程式的記憶體用量,這個結果可用于揭示目前儲存的對象數量以及它們總共占用的空間。
例2-13 heapy輸出顯示了我們代碼執行時每一個主要階段的對象總數
第三段顯示了在計算完julia集合後,我們占用了94mb的記憶體。除了之前的複數,我們現在還儲存了大量的整數,清單中的項目也變多了。
hpy<code>.setrelheap()可以用來建立一個記憶體斷點,當後續調用hpy</code>.heap()時就會産生一個跟這個斷點的差額。這樣你就可以略過斷點前由python内部操作導緻的記憶體配置設定。