为什么 Python 代码在函数中执行得更快?
考虑下面的 Python 代码片段,它执行了 1 亿次循环。
def main(): for i in range(10**8): pass main()
在 Linux 中使用时间函数测量时,这段代码运行得非常好swiftly:
real 0m1.841s user 0m1.828s sys 0m0.012s
奇怪的是,如果执行 for 循环时没有将其包含在函数中:
for i in range(10**8): pass
它的执行时间会大大增加:
real 0m4.543s user 0m4.524s sys 0m0.012s
为什么会出现这种差异?
内部函数
当代码位于函数内时,检查字节码会发现以下内容:
2 0 SETUP_LOOP 20 (to 23) 3 LOAD_GLOBAL 0 (xrange) 6 LOAD_CONST 3 (100000000) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 6 (to 22) 16 STORE_FAST 0 (i) 3 19 JUMP_ABSOLUTE 13 >> 22 POP_BLOCK >> 23 LOAD_CONST 0 (None) 26 RETURN_VALUE
函数外部
相反,当代码在顶层执行时,字节码为如下:
1 0 SETUP_LOOP 20 (to 23) 3 LOAD_NAME 0 (xrange) 6 LOAD_CONST 3 (100000000) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 6 (to 22) 16 STORE_NAME 1 (i) 2 19 JUMP_ABSOLUTE 13 >> 22 POP_BLOCK >> 23 LOAD_CONST 2 (None) 26 RETURN_VALUE
问题的症结
区别在于 STORE_FAST 与 STORE_NAME 的使用。当变量(在本例中为 i)是局部变量(在函数内)时使用 STORE_FAST,而当变量是全局变量(在函数外)时使用 STORE_NAME。前者的效率明显更高。
这可以通过以下事实来解释:当变量被声明为本地变量时,解释器可以优化代码以使用该变量的特定内存位置。然而,当一个变量被声明为全局变量时,解释器必须搜索整个全局范围才能找到该变量,这是一个比较耗时的过程。
以上是为什么 Python 代码在函数内部执行时速度更快?的详细内容。更多信息请关注PHP中文网其他相关文章!