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 相关文章推荐
pycharm 使用心得(一)安装和首次使用
Jun 05 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
八大排序算法的Python实现
Jan 28 Python
python字符串与url编码的转换实例
May 10 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
Python PIL库图片灰化处理
Apr 07 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
python Django框架快速入门教程(后台管理)
Jul 21 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
利用PHP将部分内容用星号替换
2020/04/21 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
浅析python的优势和不足之处
2018/11/20 Python
python 实现二维列表转置
2019/12/02 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
十岁生日父母答谢词
2014/01/18 职场文书
创业计划书撰写原则
2014/01/25 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
读书演讲主持词
2014/03/18 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
招标授权委托书样本
2014/09/23 职场文书
高中班主任评语
2014/12/30 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL