python程序在函数内执行得更快
陈皓:《代码执行的效率》
为什么Python程序在函数内执行得更快?(来源StackOverflow)
考虑下面的代码,一个在函数体内,一个是全局的代码。
函数内的代码执行效率为 1.8s
|
1
2
3
4
|
def main(): for i in xrange(10**8): passmain() |
函数体外的代码执行效率为 4.5s
|
1
2
|
for i in xrange(10**8): pass |
不用太纠结时间,只是一个示例,我们可以看到效率查得很多。为什么会这样呢?我们使用 dis module 反汇编函数体内的bytecode 代码,使用 compile builtin 反汇编全局bytecode,我们可以看到下面的反汇编(注意我高亮的地方)
|
1
2
3
|
13 FOR_ITER 6 (to 22)16 STORE_FAST 1 (i)19 JUMP_ABSOLUTE 13 |
|
1
2
3
|
13 FOR_ITER 6 (to 22)16 STORE_NAME 1 (i)19 JUMP_ABSOLUTE 13 |
我们可以看到,差别就是 STORE_FAST 和 STORE_NAME,前者比后者快很多。所以,在全局代码中,变量i成了一个全局变量,而函数中的i是放在本地变量表中,所以在全局变量表中查找变量就慢很多。如果你在main函数中声明global i 那么效率也就下来了。原因是,本地变量是存在一个数组中(直到),用一个整型常量去访问,而全局变量存在一个dictionary中,查询很慢。
(注:在C/C++中,这个不是一个问题)

浙公网安备 33010602011771号