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中join和split用法实例
Apr 14 Python
python将文本转换成图片输出的方法
Apr 28 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
目前最全的python的就业方向
Jun 05 Python
Python的UTC时间转换讲解
Feb 26 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
这样写python注释让代码更加的优雅
Jun 02 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下获取客户端ip地址的函数
2010/03/15 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php jsonp单引号转义
2014/11/23 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
python3中set(集合)的语法总结分享
2017/03/24 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
国际政治个人自荐信范文
2013/11/26 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
挂牌仪式主持词
2014/03/20 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
给校长的建议书500字
2014/05/15 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
HDFS免重启挂载新磁盘
2022/04/06 Servers