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 25 Python
Python实现的归并排序算法示例
Nov 21 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Django中信号signals的简单使用方法
Jul 04 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 Python
python合并多个excel文件的示例
Sep 23 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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数组总结篇(一)
2008/09/30 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
php异常处理使用示例
2014/02/25 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
js实现左右轮播图
2020/01/09 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
提升Python程序运行效率的6个方法
2015/03/31 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python实现两个文件夹的同步
2019/08/29 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
中学生个人自我评价
2014/02/06 职场文书
决心书标准格式
2014/03/11 职场文书
青蓝工程实施方案
2014/03/27 职场文书
社区综治工作汇报
2014/10/27 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
婚宴领导致辞
2015/07/28 职场文书
三八妇女节致辞
2015/07/31 职场文书
话题作文之自信作文
2019/11/15 职场文书