数据交换时候,不推荐使用中间变量。
下面的代码中,swap1的运行速度要比swap2更快。
我们用dis模块来看一下两种代码的指令流程
#!/usr/bin/env python
# encoding: utf-8
"""
@python version: ??
@author: XiangguoSun
@contact: sunxiangguodut@qq.com
@site: http://blog.csdn.net/github_36326955
@software: PyCharm
@file: suggest3.py
@time: 5/2/2017 4:02 PM
"""
import dis
def swap1():
x = 1
y = 2
x, y = y, x
return x, y
def swap2():
x = 1
y = 2
temp = x
x = y
y = temp
return x, y
print(dis.dis(swap1))
print(dis.dis(swap2))
左边那一列数字是原始源代码的行号。第二列是字节码的偏移量:LOAD_CONST在第0行,STORE_FAST在第3行,以此类推。中间那列是字节的名字。它们是为程序员所准备的——解释器是完全不需要的。
最后两列告诉我们一些关于指令参数(如果有的话)的细节。第四列是参数本身。它表示一个指向代码对象其它属性的索引。在这个例子中,LOAD_CONST的参数指向列表co_consts,STORE_FAST的参数指向co_varnames。
常见指令:
LOAD_CONST 将co_consts中对应的值压栈
STORE_DEREF 解引用,设置栈中的变量值
LOAD_CLOSURE 将freevars中的对象压栈
BUILD_TUPLE 用栈帧中的元素创建元组,并压栈
BUILD_CLOSURE 创建PyFunction对象,并设置其中的f_closure域
STORE_FAST 将栈中的一个元素设置到对应的本地变量域中
RETURN_VALUE return,并且设置退出原因WHY_RETURN
上面两个程序最大的差异在于第一个用了指令ROT_TWO,交换栈顶元素。比LOAD_FAST+STORE_FAST指令更快。