陈皓:《代码执行的效率》
为什么Python程序在函数内执行得更快?(来源StackOverflow)
考虑下面的代码,一个在函数体内,一个是全局的代码。
函数内的代码执行效率为 1.8s
1
2
3
4
|
def
main():
for
i
in
xrange
(
10
*
*
8
):
pass
main()
|
函数体外的代码执行效率为 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++中,这个不是一个问题)