详解python字节码


Posted in Python onFebruary 07, 2018

Python对不可变序列进行重复拼接操作效率会很低,因为每次都会生成一个新的对象,解释器需要把原来对象中的元素先复制到新的对象里,然后再追加新的元素。

但是CPython对字符串操作进行了优化,因为对字符串做+=操作实在是太普遍了。因此,初始化str时会预留出额外的可扩展空间,从而进行增量操作的时候不会有复制再追加的这个步骤。

通过字节码研究一下这个过程。

>>> s_code = 'a += "b"'
>>> c = compile(s_code, '', 'exec')
>>> c.co_code
b'e\x00\x00d\x00\x007Z\x00\x00d\x01\x00S'
>>> c.co_names
('a',)
>>> c.co_consts
('b', None)

得到的字节码是Bytes类型的。这里穿插一些Bytes类型的知识。

Bytes类型

b'e\x00\x00d\x00\x007Z\x00\x00d\x01\x00S',b表示是Bytes类型。Bytes以二进制字节序列的形式记录数据,每一个字符就代表一个字节(8位)。比如上面的e表示二进制0110 0101。部分ASCII码对照表如下图所示。

但是,不是所有的字节都是可显示的,甚至有些字节无法对应到ASCII码上(因为ASCII码只定义了128个字符,而一个字节有256个)。比如0000 0000对应的ASCII是不可显示的、0111 1111没有对应的ASCII码。

为了表示这些无法显示的字节,就引入了\x符号,其表示后续的字符为16进制。如,\x00表示16进制的00,也就是二进制的0000 0000。

至此,所有字节都可被表示。

字节码分析

回到开始的代码。为了显示方便,将b'e\x00\x00d\x00\x007Z\x00\x00d\x01\x00S'转为16进制来显示。

>>> c.co_code.hex()
'650000640000375a000064010053'

通过opcode.opname函数可以得到操作码所对应的操作指令

>>> import opcode
>>> opcode.opname[0x65]
'LOAD_NAME'

因此,完整的字节码可以解释为(TOS即top-of-stack,栈顶元素):

字节:位置,功能
65:0,LOAD_NAME
0000:参数,将co_names[0]的值,即a的值,压入栈
64:3,LOAD_CONST
0000:参数,将co_consts[0],即'b',压入栈
37:6,INPLACE_ADD,TOS = TOS1 + TOS
5a:7,STORE_NAME
0000:参数,co_names[0]=TOS,即将栈顶赋值给a
64:10,LOAD_CONST
0100:参数
53:13,RETURN_VALUE,Returns with TOS to the caller of the function

实际上借助dis函数可以直接获得可读的字节码:

>>> import dis
>>> dis.dis(s_code)
 1      0 LOAD_NAME        0 (a)
       3 LOAD_CONST        0 ('b')
       6 INPLACE_ADD
       7 STORE_NAME        0 (a)
       10 LOAD_CONST        1 (None)
       13 RETURN_VALUE

完整代码:

s_code = 'a += "b"'
c = compile(s_code, '', 'exec')
c.co_code
c.co_names
c.co_consts
c.co_code.hex()
import dis
dis.dis(s_code)

非常失败,对比了string和tuple的赋值字节码,并没有看出string的优化…

以上就是本次关于python字节码的相关知识点,感谢你对三水点靠木的支持。

Python 相关文章推荐
python网络编程学习笔记(10):webpy框架
Jun 09 Python
python中函数传参详解
Jul 03 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python遍历numpy数组的实例
Apr 04 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
python中round函数如何使用
Jun 19 Python
python脚本和网页有何区别
Jul 02 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
python中函数返回多个结果的实例方法
Dec 16 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 #Python
python深度优先搜索和广度优先搜索
Feb 07 #Python
Python Flask基础教程示例代码
Feb 07 #Python
Python装饰器用法实例总结
Feb 07 #Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 #Python
Python自定义线程池实现方法分析
Feb 07 #Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 #Python
You might like
php5新改动之短标记启用方法
2008/09/11 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
php支付宝APP支付功能
2020/07/29 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python读大数据txt
2016/03/28 Python
Python数据结构之翻转链表
2017/02/25 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python PyTorch预训练示例
2018/02/11 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
会计毕业生求职简历的自我评价
2013/10/20 职场文书
网络宣传方案
2014/03/15 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书