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

 晨曦微露jie 发布于 2023-01-12 08:45

为什么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非常活跃,也许他可以证实我的说法.

2 个回答
  • 它是窥视孔优化器:

    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非常活跃,也许他可以证实我的说法.

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

    2023-01-12 08:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有