python学习字符串驻留与常量折叠隐藏特性详解

 更新时间:2021-09-30 20:48:30   作者:佚名   我要评论(0)

下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。
案例一:

案例二:

案例三:

很好理解, 对吧?
说明:
这些行为是由于 Cpy

下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。

案例一:

案例二:

案例三:

很好理解, 对吧?

说明:

这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning])

发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)

在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留

所有长度为 0 和长度为 1 的字符串都被驻留.

字符串在编译时被实现 (‘wtf' 将被驻留, 但是 ‘'.join([‘w', ‘t', ‘f']) 将不会被驻留)

字符串中只包含字母,数字或下划线时将会驻留. 所以 ‘wtf!' 由于包含 ! 而未被驻留. 可以在【地址1】找到 CPython 对此规则的实现.

当在同一行将 a 和 b 的值设置为 “wtf!” 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量(译: 仅适用于3.7以下, 详细情况请看【地址2】). 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 wtf!对象 (因为 “wtf!” 不是按照上面提到的方式被隐式驻留的). 它是一种编译器优化, 特别适用于交互式环境.\

常量折叠(constant folding) 是 Python 中的一种 窥孔优化(peephole optimization) 技术. 这意味着在编译时表达式 ‘a'*20会被替换为 ‘aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期. 只有长度小于 20 的字符串才会发生常量折叠. (为啥? 想象一下由于表达式 ‘a'*10**10 而生成的 .pyc 文件的大小). 相关的源码实现在【地址3】.

如果你是使用 3.7 版本中运行上述示例代码, 会发现部分代码的运行结果与注释说明相同. 这是因为在 3.7 版本中, 常量折叠已经从窥孔优化器迁移至新的 AST 优化器, 后者可以以更高的一致性来执行优化. (由 Eugene Toder 和 INADA Naoki 在 bpo-29469 和 bpo-11549 中贡献.)

(译: 但是在最新的 3.8 版本中, 结果又变回去了. 虽然 3.8 版本和 3.7 版本一样, 都是使用 AST 优化器. 目前不确定官方对 3.8 版本的 AST 做了什么调整.)

以上就是python学习字符串驻留与常量折叠隐藏特性详解的详细内容,更多关于python隐藏特的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
  • 举例介绍Python中的25个隐藏特性
  • python常量折叠基础知识点讲解
  • python 字符串的驻留机制及优缺点
  • Python中常用的8种字符串操作方法

相关文章

  • python学习字符串驻留与常量折叠隐藏特性详解

    python学习字符串驻留与常量折叠隐藏特性详解

    下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。 案例一: 案例二: 案例三: 很好理解, 对吧? 说明: 这些行为是由于 Cpy
    2021-09-30
  • 纯JS将table表格导出到excel的方法

    纯JS将table表格导出到excel的方法

    html <div > <button type="button" onclick="getXlsFromTbl('tableExcel','myDiv')">IE导出Excel方法</button> <button type="bu
    2021-09-30
  • Python装饰器的两种使用心得

    Python装饰器的两种使用心得

    装饰器的基础使用(装饰带参函数) def decorator(func): def inner(info): print('inner') func(info) return i
    2021-09-30
  • 国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程

    国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程

    目录1. 页面布局2. 图片上传和展示3. 初始化画布4. 切换模板5. 输出图片 这里用到的技术: HTML+ CSS+ JavaScript; download.js库
    2021-09-30
  • vue与react详细

    vue与react详细

    目录一、全景图二、背景1、react:专业 2、vue:传奇 三、技术思想1、key的异同为例1.1 react 1.2 vue2、diff的宏观比较2.1 react2.2 vue
    2021-09-30
  • JavaScript实现密码框输入验证

    JavaScript实现密码框输入验证

    有时需要在前端页面,用户输入时先进行简单的验证,减少服务器压力 例如,限定了字段的输入长度: 输入框后有输入范围提示信息 输入错误长
    2021-09-30
  • Java杂谈之重复代码是什么

    Java杂谈之重复代码是什么

    目录方法为何要有参数?长参数列表的问题解决方案聚沙成塔动静分离告别标记总结有经验的程序员应该都见过,一个方法坐拥几十上百个参数。 方
    2021-09-30
  • 话费API接口

    话费API接口

    ―、引言1.1 文档概述本文档提供话费充值接口规范说明,提供一整套的完整的接入示例(http 接口)供商户参 考,可以帮助商户开发人员快速完成接口开发与联调,实现与话费充值
    2021-09-29
  • 话费充值API接口,三网可充,支持快充慢充

    话费充值API接口,三网可充,支持快充慢充

    微客云地址: http://www.wikeyun.cn/ ―、引言1.1 文档概述本文档提供话费充值接口规范说明,提供一整套的完整的接入示例(http 接口)供商户参 考,可以帮助商户开发人员快
    2021-09-29
  • 微客云全新V2版本,个人中心也支持DIY自定义装修,上线滴滴打车CPS

    微客云全新V2版本,个人中心也支持DIY自定义装修,上线滴滴打车CPS

    1、微客云v2版本个人中心装修正式上线!!2、新增京东首页模块3、新增拼多多首页模块4、新增滴滴打车CPS5、新增独家个人支付宝批量划款功能,个人号也能给用户发工资!6、新
    2021-09-29

最新评论