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 多了 两 条指令