Python dis 模块初步使用
来源:互联网 发布:蚂蚁系统分类数据调用 编辑:程序博客网 时间:2024/05/17 16:55
Python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。
Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。
先来一小段代码:
In[6]: def test():... x = 1... if x < 3:... return "yes"... else:... return "no"代码执行后会输出:
In[7]: import disIn[8]: dis.dis(test) 2 0 LOAD_CONST 1 (1) 3 STORE_FAST 0 (x) 3 6 LOAD_FAST 0 (x) 9 LOAD_CONST 2 (3) 12 COMPARE_OP 0 (<) 15 POP_JUMP_IF_FALSE 22 4 18 LOAD_CONST 3 ('yes') 21 RETURN_VALUE 6 >> 22 LOAD_CONST 4 ('no') 25 RETURN_VALUE 26 LOAD_CONST 0 (None) 29 RETURN_VALUE
以第一条指令为例, 第一列的数字(2)表示对应源代码的行数。第二列的数字是字节码的索引,指令LOAD_CONST在0位置。第三列是指令本身对应的人类可读的名字。第四列表示指令的参数。第5列则是计算后的实际参数。其中的“>>" 表示跳转的目标, 第4列的“22” 表明了跳转到索引为22的指令。
以Python代码为讲,test.__code__.co_code 表示test函数的字节码指令序列。
将此序列打印出来,
code = [ord(i) for i in list(test.__code__.co_code)]print code输出:
[100, 1, 0, 125, 0, 0, 124, 0, 0, 100, 2, 0, 107, 0, 0, 114, 22, 0, 100, 3, 0, 83, 100, 4, 0, 83, 100, 0, 0, 83]
可以通过dis.opname[100]查看,即为LOAD_CONST。而后的两个字节表示指令的参数。而dis输出的字节码指令中,
第二列的字节码索引则是指当前指令在co_code序列中所在的位置。
dis输出的字节码指令中,部分指令是没有参数, 在co_code 中也同样可以看到,83(RETURN_VALUE)直接接上下一条指令100(LOAD_CONST)。
0 0
- Python dis 模块初步使用
- 飘逸的python - 使用dis模块进行代码层次的性能剖析
- Python 库的使用 —— dis
- python分析字节码dis
- python标准库之fnmatch,dis,timeit
- python的requests初步使用
- python的requests初步使用
- python的requests初步使用
- python的requests初步使用
- python 模块使用
- python--httplib模块使用
- Python学习--使用模块
- python--httplib模块使用
- python--httplib模块使用
- python--httplib模块使用
- python--httplib模块使用
- Python日志模块使用
- python fnmatch模块使用
- solution Of 1102. Invert a Binary Tree (25)
- NIO实现原理
- 【3D计算机图形学】变换矩阵、欧拉角、四元数
- 树莓派学习系列6——Sonic Pi音乐编程
- C++编码转换函数代码
- Python dis 模块初步使用
- MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案
- LeetCode--No.13--Roman to Integer
- ThreadLocal的简单入门使用
- shared_ptr的自定义析构函数的作用在于搭建一座桥
- LeetCode--No.12--Integer to Roman
- final的初始化
- Openstack组件部署 — Keystone Install & Create service entity and API endpoints
- LVS-DR模型实现负载均衡