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 相关文章推荐
wxPython使用系统剪切板的方法
Jun 16 Python
利用aardio给python编写图形界面
Aug 21 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
python numpy格式化打印的实例
May 14 Python
python中的decorator的作用详解
Jul 26 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
python代码实现ID3决策树算法
2017/12/20 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python实现接口并发测试脚本
2019/06/25 Python
Python调用C语言程序方法解析
2020/07/07 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
关于保护环境的建议书
2014/08/26 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
python 网络编程要点总结
2021/06/18 Python