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 相关文章推荐
Python实现多行注释的另类方法
Aug 22 Python
Python深入学习之上下文管理器
Aug 31 Python
介绍Python的@property装饰器的用法
Apr 28 Python
numpy自动生成数组详解
Dec 15 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
Python猜数字算法题详解
Mar 01 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
Python如何执行精确的浮点数运算
Jul 31 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python实现大文本文件分割成多个小文件
Apr 20 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
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php不用正则验证真假身份证
2013/11/06 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python3处理文件中每个词的方法
2015/05/22 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
轻化专业学生实习自我鉴定
2013/09/20 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫