dis模块——神奇的字节码

dis模块 入门

Python代码先翻译成字节码,又由Python虚拟机来执行字节码,python的字节码类似汇编指令的中间语言,一个Python语言会对用若干字节码指令,虚拟机一条条执行指令,从而完成程序的执行

Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。

import dis
def main():
    while 1:
        pass
    while True:
        pass
dis.dis(main)

执行结果如下

  3           0 SETUP_LOOP               4 (to 6)

  4     >>    2 JUMP_ABSOLUTE            2
              4 POP_BLOCK

  5     >>    6 SETUP_LOOP               4 (to 12)

  6     >>    8 JUMP_ABSOLUTE            8
             10 POP_BLOCK
        >>   12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

以第一条指令为例, 第一列的数字(2)表示对应源代码的行数。第二列的数字是字节码的索引,指令LOAD_CONST在0位置。第三列是指令本身对应的人类可读的名字。第四列表示指令的参数。第5列则是计算后的实际参数。其中的“>>” 表示跳转的目标, (to x) 表明了跳转到索引为x的指令。

具体的指令参数可以参考https://docs.python.org/3/library/dis.html

至于为什么使用上述例子:

因为我最开始就听到过一句话就是: while 1 的执行速度比 while True 的执行速度快,当然 这句话在python2中是正确的,但是在python3中可以看出 没有区别。在python 3 中都是在执行到while 的时候直接跳转了

在python2中 True 并不是一个关键字,而是一个内置参数,我们在python2中可以输入

>>> True + True
2

在python2中 While True 代表着需要进行一步的运算 将True转换成1 在进行判断,所以 while 1 的执行速度比while True快

如果不信的话看下面例子

>>> import dis
>>> def main():
...     while 1:
...             pass
...     while True:
...             pass
...
>>> dis.dis(main)
  2           0 SETUP_LOOP               4 (to 7)

  3     >>    3 JUMP_ABSOLUTE            3
              6 POP_BLOCK

  4     >>    7 SETUP_LOOP              10 (to 20)
        >>   10 LOAD_GLOBAL              0 (True)
             13 POP_JUMP_IF_FALSE       19

  5          16 JUMP_ABSOLUTE           10
        >>   19 POP_BLOCK
        >>   20 LOAD_CONST               0 (None)
             23 RETURN_VALUE

看不懂具体是什么意思但是可以看得出 在Python2 中 while True 多了 两 条指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值