美文网首页大数据 爬虫Python AI SqlPython
Python隐藏特性:字符串驻留、常量折叠

Python隐藏特性:字符串驻留、常量折叠

作者: 是程序员吖 | 来源:发表于2019-12-24 16:01 被阅读0次

下面是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 中贡献.)  

在学习Python的过程中,往往因为没有资料或者没人指导从而导致自己不想学下去了,因此我特意准备了个群 592539176 ,群里有大量的PDF书籍、教程都给大家免费使用!不管是学习到哪个阶段的小伙伴都可以获取到自己相对应的资料!

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

相关文章

  • Python隐藏特性:字符串驻留、常量折叠

    下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。 案例一: 案例二: 案例三: 很好理解, 对吧? ...

  • Python3中的字符串驻留机制#Python学习03#

    字符串驻留:仅保存一份相同且不可变字符串,不同的值被存放在字符串驻留池中。 Python 支持字符串驻留机制,对于...

  • Python(三)

    字符串 创建和驻留机制 在python中字符串是基本数据类型,是一个不可变的字符序列 什么叫字符串驻留机制:仅保存...

  • 常量折叠

    常量折叠说的是,在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间。 示例...

  • java常用类

    一、String特性: 二、String字面量定义的说明: String定义的字符串会在方法区当中的字符串常量池中...

  • 探究Python源码,终于弄懂了字符串驻留技术

    摘要:在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(Str...

  • python基础(二)

    python变量赋值常量 不变化的量,比如数字,字符串都是变量 存储常量,通常由变量名指出赋值 就是将一个常量指向...

  • python数据类型

    字符串 类型:python中的数据类型 特性:不能修改 格式: 字符串的用法: 列表 类型:python中的数据类...

  • Python3中copy模块常用功能及其他几种copy方式比较

    1、简单的共享引用: python中内置有小整数常量池和字符串常量池,在某个范围内的相同的数字或字符串分别赋给不同...

  • python3 判断类型是否为空

    python 判断数组、字符串、对象、字典等是否为空? 字符串为空判断 打印 其他常量判断 同理字符串 这些都是f...

网友评论

    本文标题:Python隐藏特性:字符串驻留、常量折叠

    本文链接:https://www.haomeiwen.com/subject/tghfoctx.html