python常量折叠基础知识点讲解


Posted in Python onFebruary 28, 2021

1、概念

所谓常量折叠,指的是在编译时就查找并计算常量表达式,而不是在运行时再对其进行计算,从而会使运行时更加精简和快速。

2、实例

在 Python 中,我们可以使用反汇编模块(Disassembler)获取 CPython 字节码,从而更好地了解代码执行的过程。

当使用dis模块反汇编上述常量表达式时,我们会得到以下字节码:

>>> import dis
>>> dis.dis("day_sec = 24 * 60 * 60")
    0 LOAD_CONST        0 (86400)
    2 STORE_NAME        0 (day_sec)
    4 LOAD_CONST        1 (None)
    6 RETURN_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常量折叠是什么内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
详解python中executemany和序列的使用方法
Aug 12 Python
python中for用来遍历range函数的方法
Jun 08 Python
python监测当前联网状态并连接的实例
Dec 18 Python
Python实现打砖块小游戏代码实例
May 18 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
python3实现单目标粒子群算法
Nov 14 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
Python 如何调试程序崩溃错误
Aug 03 Python
Django后端按照日期查询的方法教程
Feb 28 #Python
python元组拆包实现方法
Feb 28 #Python
python定义具名元组实例操作
Feb 28 #Python
python推导式的使用方法实例
Feb 28 #Python
python线程优先级队列知识点总结
Feb 28 #Python
利用Opencv实现图片的油画特效实例
Feb 28 #Python
利用python实现后端写网页(flask框架)
Feb 28 #Python
You might like
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
JS解密入门之凭直觉解
2008/06/25 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JS常用函数使用指南
2014/11/23 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
ElementUI radio组件选中小改造
2019/08/12 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
Python多线程编程简单介绍
2015/04/13 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
python对日志进行处理的实例代码
2018/10/06 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
什么是Remote Module
2016/06/10 面试题
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
2014年科技工作总结
2014/11/26 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python