为什么python试图计算p
定义期间的值?定义此功能需要很长时间.
def f(): raise Exception('Some error') p = 2322111239**42322222334923492304923 print 'Defined!'
另外,如果p
在定义期间计算值,为什么可以无错误地定义此函数?
def f(): return 4 p = 11/0
这个显然工作正常,因为不涉及常量:
def f(): raise Exception('Some error') x=42322222334923492304923 p = 2322111239**x print 'Defined!'
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;
目的是以更慢的定义(读取:导入)时间为代价加速函数的运行时执行.这是有道理的,因为你只需要编译一次该函数的代码,但你可能需要多次调用它.
我相信优化器是由Raymond Hettinger编写的,他对SO非常活跃,也许他可以证实我的说法.
它是窥视孔优化器:
http://hg.python.org/cpython/file/eabff2a97b5b/Python/peephole.c#l88
特别参见第104-106行
case BINARY_POWER: newconst = PyNumber_Power(v, w, Py_None); break;
目的是以更慢的定义(读取:导入)时间为代价加速函数的运行时执行.这是有道理的,因为你只需要编译一次该函数的代码,但你可能需要多次调用它.
我相信优化器是由Raymond Hettinger编写的,他对SO非常活跃,也许他可以证实我的说法.
解释器的这个特性被称为constant folding
(这里有一些很好的信息).存在若干问题,即使是过于激进的恒定折叠.类似的问题也可以用于内存,其中分配了大量内存并再次直接丢弃(参见此处).