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

作者:燕山588 时间:2021-01-19 14:40:10 

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

案例一:

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

案例二:

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

案例三:

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

很好理解, 对吧?

说明:

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

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

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

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

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

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

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

当在同一行将 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 做了什么调整.)

来源:https://blog.csdn.net/kj7762/article/details/120367404

标签:字符串,驻留,常量折叠
0
投稿

猜你喜欢

  • 妙用Dreamweaver MX共享WPS Office文件

    2010-09-05 21:18:00
  • 解读python基于netconf协议获取网元的数据

    2023-06-29 20:26:23
  • php防止sql注入示例分析和几种常见攻击正则表达式

    2023-11-23 17:01:02
  • php利用cookies实现购物车的方法

    2023-07-23 08:32:37
  • JS实现两周内自动登录功能

    2023-08-04 21:20:57
  • 渗透和改变 非洲web 2.0网站Logo

    2008-01-22 13:31:00
  • IE的button元素bug

    2009-12-08 12:39:00
  • python的几种开发工具介绍

    2021-09-28 01:54:44
  • 如何远程连接SQL Server数据库

    2009-06-08 12:41:00
  • Access命令行参数

    2007-08-23 15:35:00
  • matplotlib grid()设置网格线外观的实现

    2021-08-26 08:39:13
  • Python中内置数据类型list,tuple,dict,set的区别和用法

    2022-09-10 05:59:46
  • ASP编写计数器的优化方法

    2009-01-21 19:46:00
  • 用browsercam做用户登录后页面的兼容性测试

    2008-12-29 12:05:00
  • python读取dicom图像示例(SimpleITK和dicom包实现)

    2023-07-06 14:08:10
  • ASP|HTML]单引与双引号

    2008-03-12 11:42:00
  • 面向对象设计过程中必须遵守的相关准则

    2009-01-08 15:52:00
  • 聊天室php&mysql(五)

    2023-11-19 20:18:22
  • python return实现汇率转换器教程示例

    2023-11-10 12:39:50
  • Flask和Django框架中自定义模型类的表名、父类相关问题分析

    2022-04-04 00:23:17
  • asp之家 网络编程 m.aspxhome.com