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使用Supervisor来管理进程的方法
May 28 Python
python2.7到3.x迁移指南
Feb 01 Python
Django如何配置mysql数据库
May 04 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
如何使用repr调试python程序
Feb 28 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
pytorch查看网络参数显存占用量等操作
May 12 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使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
深入理解python对json的操作总结
2017/01/05 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python和php哪个更适合写爬虫
2020/06/22 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
求职推荐信
2013/10/28 职场文书
商务英语专业毕业生自荐信
2013/11/05 职场文书
班班通校本培训方案
2014/03/12 职场文书
医学求职信
2014/05/28 职场文书
校园绿化美化方案
2014/06/08 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书