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/54245945/

相关文章:

android - getDrawable() 的效率 : is the Drawable cached by the framework?

python - 将 csv 文件与 pySpark 进行比较

python - 在 Pymongo 中执行批量插入时如何忽略错误。我在 pymongo 中使用有序的批量写入操作

python - 共享列表(多处理-管理器-列表)非常耗时

python - 损坏的 zip 下载 urllib2

go - 为什么在对象上使用 new() 不会包含在 Go 的内存分析文件中?

java - 错误处理和效率?

javascript - 提高 Highcharts 折线图的性能

asp.net - 迁移匿名配置文件的最佳方式

mysql - 极慢的 SQL 选择查询