1.查看python所有的位元組碼列表的方法 :
執行這段代碼就能看到位元組碼的列表:
import opcode for op in range(len(opcode.opname)): print('0x%.2X(%.3d): %s' % (op, op, opcode.opname[op]))
既然叫“位元組碼”,這些作業碼自然是以位元組為單位的咯,於是最多隻能表示256個不同的作業碼。Python實際上只用了百來個作業碼。
作業碼小於90的為無參數的,指令僅包含作業碼自身,共1位元組;大於等於90的,則每條指令在作業碼之後還帶有1個參數,參數長度為2位元組,共3位元組。
Python程式的位元組碼在運行時以PyStringObject的形式儲存在PyCodeObject的co_code域裡。co_code域只含有指令而不包含別的程式資料;變數名、常量等資料均放在別的域裡。
Python的位元組碼指令集是基於棧的指令集。這裡說的“棧”不是指函數調用棧,而是指專門用於求值的棧,可以稱為“求值棧”(evaluation stack)或者“運算元棧”(operand stack)。求值過程的臨時變數都放在求值棧上,指令集中的大部分都是與棧打交道。
例如3 + 4會變成:
Python bytecode代碼 LOAD_CONST 0 (3) LOAT_CONST 1 (4) BINARY_ADD
假設常量池中下標為0和1的項分別是3和4這兩個常量,則頭兩條指令分別將這兩個常量壓入求值棧,然後BINARY_ADD指令將求值棧棧頂的兩個值彈出,計算加法,並將結果再次壓入棧中。理解了這點,則Python的指令集基本上都能顧名思義。作業碼對應的具體意義可以在下面的官網文檔連結查到。
2具體查看你的程式中涉及的位元組碼的方法:
1.查看模組中所有函數和所有類中的函數產生的位元組碼:
import dis,target
dis.dis(target)
2.查看模組中某函數或類中某函數產生的位元組碼:
import dis,target
dis.dis(target.funcA)
或
import dis,target
dis.dis(target.classA)
3.查看函數外的操作:
s=open('target.py').read()
co=compile(s,'target.py','exec')
import dis
dis.dis(co)