查看python位元組碼__python

來源:互聯網
上載者:User

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)


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.