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 装饰器功能以及函数参数使用介绍
Jan 27 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
python实现flappy bird游戏
Dec 24 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
Python Django基础二之URL路由系统
Jul 18 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
Python处理PDF与CDF实例
Feb 26 Python
python批量更改目录名/文件名的方法
Apr 18 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实现将GB编码转换为UTF8
2006/11/25 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
JS backgroundImage控制
2009/05/19 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
微信小程序入门教程
2016/11/18 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
网络安全方面的面试题
2016/01/07 面试题
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
银行财务部实习生的自我鉴定
2013/11/27 职场文书
开办化妆品公司创业计划书
2013/12/26 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
房展策划方案
2014/06/07 职场文书
2014年女职工工作总结
2014/11/27 职场文书
公司仓库管理制度
2015/08/04 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python