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错误处理详解
Sep 28 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
python中for语句简单遍历数据的方法
May 07 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python打印斐波拉契数列实例
Jul 07 Python
深入理解Python中的*重复运算符
Oct 28 Python
Python实现句子翻译功能
Nov 14 Python
pandas带有重复索引操作方法
Jun 08 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
Django 静态文件配置过程详解
Jul 23 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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
回帖脱衣服的图片实现代码
2014/02/15 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
javascript document.images实例
2008/05/27 Javascript
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python urlopen 使用小示例
2008/09/06 Python
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python实现AES加密与解密
2019/03/28 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
奉献爱心演讲稿
2014/09/04 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android