查看python字节码

时间:2021-03-12 17:06:10

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代码   查看python字节码
  1. LOAD_CONST 0 (3)  
  2. LOAT_CONST 1 (4)  
  3. 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)