84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
Python代码放在函数中运行比放在全局中运行要快?
Is it faster to run Python code in a function than globally? -PHP Chinese website Q&A-Is it faster to run Python code in a function than in the global context? -PHP Chinese website Q&A
Let’s take a look and learn.
因为CPython的解释器实现细节。CPython的解释器,对局部变量是用数组存储,用下标来访问;而对全局变量是用dict来存储,用符号(symbol)来做hash访问。速度差距是杠杠的。这是因为一旦函数定义好之后,局部变量的个数就不能改了,所以可以用固定大小的容器存储;而全局名字是可以一边执行一边改变的,所以得用更动态的方式来存储。
看CPython的字节码的 LOAD_FAST 与 LOAD_GLOBAL 就可以看出差异了
这个用Python实现的解释器其中就有这里提到的读写局部变量用的 LOAD_FAST / STORE_FAST 指令的实现——但为了简单起见,它实现这两条字节码指令是用 dict 来存储数据的,而不是像真正的CPython那样用数组来存储。其实稍微改改这个Python代码就可以让它在这方面更接近CPython的样子了。
正常Python里是改变不了实际局部变量的状态的
>>> def foo(): ... a = 1 ... b = 2 ... locals()['a'] = 42 ... print(a, b) ... >>> foo() (1, 2) >>> import dis >>> dis.dis(foo) 2 0 LOAD_CONST 1 (1) 3 STORE_FAST 0 (a) 3 6 LOAD_CONST 2 (2) 9 STORE_FAST 1 (b) 4 12 LOAD_CONST 3 (42) 15 LOAD_GLOBAL 0 (locals) 18 CALL_FUNCTION 0 21 LOAD_CONST 4 ('a') 24 STORE_SUBSCR
Is it faster to run Python code in a function than globally? -PHP Chinese website Q&A-Is it faster to run Python code in a function than in the global context? -PHP Chinese website Q&A
Let’s take a look and learn.
因为CPython的解释器实现细节。
CPython的解释器,对局部变量是用数组存储,用下标来访问;而对全局变量是用dict来存储,用符号(symbol)来做hash访问。速度差距是杠杠的。
这是因为一旦函数定义好之后,局部变量的个数就不能改了,所以可以用固定大小的容器存储;而全局名字是可以一边执行一边改变的,所以得用更动态的方式来存储。
看CPython的字节码的 LOAD_FAST 与 LOAD_GLOBAL 就可以看出差异了
这个用Python实现的解释器其中就有这里提到的读写局部变量用的 LOAD_FAST / STORE_FAST 指令的实现——但为了简单起见,它实现这两条字节码指令是用 dict 来存储数据的,而不是像真正的CPython那样用数组来存储。其实稍微改改这个Python代码就可以让它在这方面更接近CPython的样子了。
正常Python里是改变不了实际局部变量的状态的