前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 打印函数字节码

Python 打印函数字节码

作者头像
为为为什么
发布2022-08-09 17:57:41
8180
发布2022-08-09 17:57:41
举报
文章被收录于专栏:又见苍岚

查看字节码可以帮助我们更好的理解python的执行流程,本文记录 python 生成函数字节码的方法。

简介

  • 既然叫“字节码”,这些操作码自然是以字节为单位的咯,于是最多只能表示256个不同的操作码。Python实际上只用了百来个操作码。
  • 操作码小于90的为无参数的,指令仅包含操作码自身,共1字节;大于等于90的,则每条指令在操作码之后还带有1个参数,参数长度为2字节,共3字节。
  • Python程序的字节码在运行时以PyStringObject的形式保存在PyCodeObject的co_code域里。co_code域只含有指令而不包含别的程序数据;变量名、常量等数据均放在别的域里。
  • Python的字节码指令集是基于栈的指令集。这里说的“栈”不是指函数调用栈,而是指专门用于求值的栈,可以称为“求值栈”(evaluation stack)或者“操作数栈”(operand stack)。求值过程的临时变量都放在求值栈上,指令集中的大部分都是与栈打交道。

实现方法

  • 打印函数字节码主要用到 python dis 库
查看模块中所有函数和所有类中的函数字节码
代码语言:javascript
复制
import dis,target
dis.dis(target)

查看模块中某函数或类中某函数生成的字节码:
代码语言:javascript
复制
import dis,target
dis.dis(target.funcA)

代码语言:javascript
复制
import dis,target
dis.dis(target.classA)

查看函数外的操作:
代码语言:javascript
复制
import dis
s=open('target.py').read()
co=compile(s,'target.py','exec')

dis.dis(co)

示例

  • 将简单的函数转化为字节码:
代码语言:javascript
复制
import dis

def hello(x, y):
    t = x ** 2
    s = y ** 0.5
    r = t + s
    return r

dis.dis(hello)

  • 字节码
代码语言:javascript
复制
4           0 LOAD_FAST                0 (x)
              2 LOAD_CONST               1 (2)
              4 BINARY_POWER
              6 STORE_FAST               2 (t)

  5           8 LOAD_FAST                1 (y)
             10 LOAD_CONST               2 (0.5)
             12 BINARY_POWER
             14 STORE_FAST               3 (s)

  6          16 LOAD_FAST                2 (t)
             18 LOAD_FAST                3 (s)
             20 BINARY_ADD
             22 STORE_FAST               4 (r)

  7          24 LOAD_FAST                4 (r)
             26 RETURN_VALUE

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 实现方法
    • 查看模块中所有函数和所有类中的函数字节码
      • 查看模块中某函数或类中某函数生成的字节码:
        • 查看函数外的操作:
        • 示例
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档