python常量折叠基础知识点讲解
1、概念
所谓常量折叠,指的是在编译时就查找并计算常量表达式,而不是在运行时再对其进行计算,从而会使运行时更加精简和快速。
2、实例
在Python中,我们可以使用反汇编模块(Disassembler)获取CPython字节码,从而更好地了解代码执行的过程。
当使用dis模块反汇编上述常量表达式时,我们会得到以下字节码:
>>>importdis >>>dis.dis("day_sec=24*60*60") 0LOAD_CONST0(86400) 2STORE_NAME0(day_sec) 4LOAD_CONST1(None) 6RETURN_VALUE
从字节码中可以看出,它只有一个LOAD_CONST,以及一个已经计算好的值86400。
这表明CPython解释器在解析和构建抽象语法树期间,会折叠常量表达式24*60*60,并将其替换为计算值86400。
知识点扩展:
常量折叠的外部细节
当初,咱们将重点转移到外部的实现细节,即关注CPython在哪里以及如何实现常量折叠。
所有的AST优化(包含常量折叠)都能够在ast_opt.c文件中找到。根本的开始函数是astfold_expr,它会折叠Python源码中蕴含的所有表达式。
这个函数以递归形式遍历AST,并试着折叠每个常量表达式,如上面的代码片段所示:
astfold_expr在折叠某个表达式之前,会尝试折叠其子表达式(操作对象),而后将折叠操作代理给特定的表达式折叠函数。
特定操作的折叠函数对表达式求值,并返回计算后的常数,而后将其放入AST中。
例如,每当astfold_expr遇到二值运算时,它便调用fold_binop,递归地计算两个子操作对象(表达式)。
fold_binop函数返回计算后的常量值,如上面的代码片段所示:
fold_binop函数通过查看以后运算符的品种,而后调用其相应的处理函数来折叠二值运算。例如,如果以后的操作是加法运算,为了计算最终值,它会对其左侧和右侧操作数调用PyNumber_Add。
到此这篇关于python常量折叠基础知识点讲解的文章就介绍到这了,更多相关python常量折叠是什么内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。