Python中的函数定义需要花费大量时间

Pio*_*ski 11 python function python-2.7

为什么python试图计算p定义期间的值?定义此功能需要很长时间.

def f():
    raise Exception('Some error')
    p = 2322111239**42322222334923492304923

print 'Defined!'
Run Code Online (Sandbox Code Playgroud)

另外,如果p在定义期间计算值,为什么可以无错误地定义此函数?

def f():
    return 4
    p = 11/0
Run Code Online (Sandbox Code Playgroud)

这个显然工作正常,因为不涉及常量:

def f():
    raise Exception('Some error')
    x=42322222334923492304923
    p = 2322111239**x

print 'Defined!'
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 8

它是窥视孔优化器:

http://hg.python.org/cpython/file/eabff2a97b5b/Python/peephole.c#l88

特别参见第104-106行

case BINARY_POWER:
    newconst = PyNumber_Power(v, w, Py_None);
    break;
Run Code Online (Sandbox Code Playgroud)

目的是以更慢的定义(读取:导入)时间为代价加速函数的运行时执行.这是有道理的,因为你只需要编译一次该函数的代码,但你可能需要多次调用它.

我相信优化器是由Raymond Hettinger编写的,他对SO非常活跃,也许他可以证实我的说法.

  • @dawg它确实在编译时抛出一个错误,但它是在cpython中处理的.该案例的错误处理从第209行开始http://hg.python.org/cpython/file/cd87afe18ff8/Python/peephole.c#l209 (5认同)
  • @anon它实际上不是__executing__函数,它只是计算其中常量的值. (2认同)

小智 7

解释器的这个特性被称为constant folding(这里有一些很好的信息).存在若干问题,即使是过于激进的恒定折叠.类似的问题也可以用于内存,其中分配了大量内存并再次直接丢弃(参见此处).