python - 为什么 Python 代码在函数中运行得更快?

标签 python performance profiling benchmarking cpython

def main():
    for i in xrange(10**8):
        pass
main()

这段代码在Python中运行(注意:在Linux中是用BASH中的time函数来计时的)

real    0m1.841s
user    0m1.828s
sys     0m0.012s

但是,如果 for 循环没有放在函数中,

for i in xrange(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_FASTSTORE_NAME 快(!) .这是因为在一个函数中,i 是局部的,但在顶层它是全局的。

要检查字节码,请使用 dis module .我能够直接反汇编该函数,但要反汇编顶层代码,我必须使用 compile builtin .

关于python - 为什么 Python 代码在函数中运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444273/

相关文章:

python - 如何在python中将纬度经度转换为十进制?

visual-studio-code - 如何使用我的 Telegram Bot 使用他们的用户名向某人发送消息

c# - WPF DataGrid 和 ScrollViewer 性能低下

c - 如何分析在 FreeBSD 上运行的持续运行的服务器

Haskell 分析 - clock_gettime

python - 遍历大文件的一部分的内存高效方法

python - 如何用破折号替换所有空格、制表符、换行符、逗号和下划线?

c++ - 加速一个长的 python 代码,该代码被证明仅由于单个 block 而变慢

javascript - 更改属性时延迟渲染 dom 元素

ruby - 有没有好的 ruby​​ 线路分析器?