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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python验证码识别处理实例
Dec 28 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
详解python使用turtle库来画一朵花
Mar 21 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
Python语法分析之字符串格式化
Jun 13 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
如何用python写个模板引擎
Jan 14 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
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
Js sort排序使用方法
2011/10/17 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python实现微信小程序自动回复
2018/09/10 Python
tensorflow 模型权重导出实例
2020/01/24 Python
python的列表List求均值和中位数实例
2020/03/03 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
python中round函数如何使用
2020/06/19 Python
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
公司口号大全
2014/06/11 职场文书
新学期标语
2014/06/30 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
员工辞退通知书
2015/04/17 职场文书
原告离婚代理词
2015/05/23 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android