轉自:http://hi.baidu.com/tinyweb/item/923d012e8146d00872863ec0 ,格式調整過。
代碼分析不是一個新的話題,代碼分析重要性的判斷比較主觀,不同的人有不同的認識。Python是用C來實現的,所以對於Python的性能或代碼質量的評估可以通過dis模塊獲取到對應的字節碼指令來進行評估。
Python代碼是先被編譯為Python字節碼后,再由Python虛擬機來執行Python字節碼(pyc文件主要就是用於存儲字節碼指令 的)。一般來說一個Python語句會對應若干字節碼指令,Python的字節碼是一種類似匯編指令的中間語言,但是一個字節碼指令並不是對應一個機器指 令(二進制指令),而是對應一段C代碼,而不同的指令的性能不同,所以不能單獨通過指令數量來判斷代碼的性能,而是要通過查看調用比較頻繁的指令的代碼來 確認一段程序的性能。
一個Python的程序會有若干代碼塊組成,例如一個Python文件會是一個代碼塊,一個類,一個函數都是一個代碼塊,一個代碼塊會對應一個運行的上下文環境以及一系列的字節碼指令。
dis模塊主要是用來分析字節碼的一個內置模塊,經常會用到的方法是dis.dis([bytesource]),參數為一個代碼塊,可以得到這個代碼塊對應的字節碼指令序列。
class A: def test(self): pass def test2(self): print "aaa"
調用dis.dis(A)會得到如下結果(不同版本的Python得到的指令可能不一樣)
Disassembly of test:
3 0 LOAD_CONST 0 (None) 3 RETURN_VALUE Disassembly of test2: 5 0 LOAD_CONST 1 ('aaa') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE dis.dis(A.test) 3 0 LOAD_CONST 0 (None) 3 RETURN_VALUE
至於每個指令的實現可以參考Python-2.4.4/Python/ceval.c中的實現,大部分指令的可讀性還是比較好的。
通過dis模塊包含的一些雷屬性可以了解到Python字節碼指令的信息。