찾다

 >  Q&A  >  본문

Python代码放在函数中运行比放在全局中运行要快?

Python代码放在函数中运行比放在全局中运行要快?

末日的春天末日的春天2828일 전1459

모든 응답(2)나는 대답할 것이다

  • 数据分析师

    数据分析师2017-10-01 00:36:11

    전역적으로 실행하는 것보다 함수 내에서 Python 코드를 실행하는 것이 더 빠릅니까? -PHP 중국어 웹사이트 Q&A-파이썬 코드를 전역 컨텍스트에서 실행하는 것보다 함수에서 실행하는 것이 더 빠른가요? -PHP 중국어 홈페이지 Q&A

    꼭 보고 배워보세요.

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-03-01 09:35:45

    因为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


    회신하다
    0
  • 취소회신하다