在Python开发中,一个常见的效率优化方法就是在进入循环之前,使用局部变量来替代全局变量。具体的,可以对比下面的两个函数:
g = 2
def local_var():
global g
l = g
for i in range(100000000):
i % l
i + l
def global_var():
global g
for i in range(100000000):
i % g
i + g
在这个大循环中,global_var采用了全局变量,而local_var中则先用l = g
把全局变量放到了局部变量里。我们可以通过timeit模块来获取他们的运行时间,比如
>>> import timeit
>>> timeit.timeit(local_var, number=1, globals=globals())
6.773113199975342
>>> timeit.timeit(global_const, number=1, globals=globals())
6.331308399792761
如果多次比较,会发现local_var确实明显要比global_var快一些。为了分析原因,我们可以用dis模块来分别反编译这两个函数的Python中间代码,放在下面进行对比:
dis.dis(local_var) |
dis.dis(global_var) |
|
|
比较发现,两个函数的主要区别在于循环中,local_var使用的是LOAD_FAST指令儿global_var中使用的是LOAD_GLOBAL指令。在Python的解释器执行中,因为LOAD_GLOBAL要在全局的字典中进行查找,所以LOAD_GLOBAL要比LOAD_FAST慢不少。这应该就是采用局部变量这一优化方法可以让Python程序更快的原因了。所以,养成在进入大规模的循环之前,用局部变量还是替代全局变量的习惯,还是相当有必要的。