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 socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python实现爬虫爬取NBA数据功能示例
May 28 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
python读写csv文件的方法
Aug 13 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
python获取命令行参数实例方法讲解
Nov 02 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
Python字典的基础操作
Nov 01 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使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
python实现查询苹果手机维修进度
2015/03/16 Python
python 同时运行多个程序的实例
2019/01/07 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
我们的节日清明节活动总结
2014/04/30 职场文书
物流管理专业自荐信
2014/06/23 职场文书
作风整顿剖析材料
2014/09/30 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
科技馆观后感
2015/06/08 职场文书
爱国主题班会教案
2015/08/14 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python