详解python字节码

 更新时间:2018年02月07日 11:07:25   作者:Titan0427  
本篇文章给大家总结了关于python字节码的相关知识点以及知识点分析,对此有需要的朋友参考学习下。

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实现requests发送/上传多个文件的示例

    python实现requests发送/上传多个文件的示例

    今天小编就为大家分享一篇python实现requests发送/上传多个文件的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python编程之顺序执行与程序的主入口详解

    Python编程之顺序执行与程序的主入口详解

    程序从程序入口进入,到程序执行结束,大体是按照顺序结构执行语句、函数或代码块,掌握程序的结构,有利于把握程序的主体框架,下面这篇文章主要给大家介绍了关于Python编程之顺序执行与程序的主入口的相关资料,需要的朋友可以参考下
    2022-12-12
  • Python学习之二叉树实现的示例详解

    Python学习之二叉树实现的示例详解

    这篇文章主要为大家详细介绍了Python实现二叉树的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-04-04
  • 解决tensorflow模型压缩的问题_踩坑无数,总算搞定

    解决tensorflow模型压缩的问题_踩坑无数,总算搞定

    这篇文章主要介绍了解决tensorflow模型压缩的问题_踩坑无数,总算搞定!希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python实现静态服务器

    python实现静态服务器

    这篇文章主要为大家详细介绍了python实现静态服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 使用Python和jieba库生成中文词云的示例代码

    使用Python和jieba库生成中文词云的示例代码

    在文本分析和数据可视化的领域中,词云是一种展示文本数据中关键词频率的直观方式,Python作为一种强大的编程语言,提供了多种库来帮助我们生成词云,在本文中,我们将通过一个简单的示例,展示如何使用Python生成中文词云,需要的朋友可以参考下
    2024-07-07
  • pandas实现按行选择的示例代码

    pandas实现按行选择的示例代码

    这篇文章主要介绍了pandas实现按行选择的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 使用Python抓取模板之家的CSS模板

    使用Python抓取模板之家的CSS模板

    本文给大家介绍的是使用Python抓取模板之家的CSS模板并打包成zip文件的代码,使用的是单线程,非常简单实用,这里分享给大家,有相同需求的小伙伴参考下吧。
    2015-03-03
  • Python中下划线含义详解

    Python中下划线含义详解

    大家好,本篇文章主要讲的是Python中下划线含义详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • python中re.findall函数实例用法

    python中re.findall函数实例用法

    在本篇文章里小编给大家整理了一篇关于python中re.findall函数实例用法相关内容,有兴趣的朋友们可以学习下。
    2021-09-09

最新评论