最近有同事提了一个有意思的问题.
“同一段代码”放在函数里运行要比直接书写运行的更快
for i in xrange(10**8):
pass
今天查了资料,发现其实蛮有意思的. 其本质是局部变量的操作速度要快于全局变量.
python代码运行之前会编译为字节码(.pyc),可以发现两段代码的差异就是局部变量和全局变量的差异,局部变量采用STORE_FAST的方式操作,全局变量只能采用STORE_NAME的方式操作,当然前者速度快于后者.
一个不可理解的问题背后,深究一下,都会涉及很多有意思的问题.(实际还会比我这描述的更深)
测试代码:
import dis
import time
def cal_run_time(f):
def wrapper(*args,**kws):
start = time.time()
ret = f(*args,**kws)
end = time.time()
print("{} needs {} s".format(f.__name__,str(end-start)[:5]))
return ret
return wrapper
@cal_run_time
def main():
for i in xrange(10**8):
pass
#use this to avoid cal_run_time code showing
def main_only():
for i in xrange(10**8):
pass
@cal_run_time
def main_global():
global i
for i in xrange(10**8):
pass
def main_global_only():
global i
for i in xrange(10**8):
pass
if __name__=="__main__":
#test global running
start = time.time()
for i in xrange(10**8):
pass
end = time.time()
print("{} needs {} s".format("global",str(end-start)[:5]))
#this should be the same as above
main_global()
#test function running
main()
#show disassembled bytecode of main function
dis.dis(main_only)
dis.dis(main_global_only)