更多课程 选择中心


Python培训

400-996-5531

Python 高效处理字符串的秘密:字符串 Intern 机制


字符串在 Python 中是最简单也是最常用的数据类型之一,在 CPython 中字符串的实现过程中使用了一种叫做 Intern(字符串驻留)的技术来提高字符串效率。那么究竟什么是 intern 机制,这种机制又是如何提高字符串效率的呢?希望这篇文章能够抛砖引玉。

先来看一段代码:

>>> s3 = "hello!">>> s4 = "hello!">>> s3 is s4False>>> id(s3)80325968L>>> id(s4)80326048L

s3 和 s4 虽然值是一样的,但确确实实是两个不同的字符串对象,Python 会为它们俩各自分配一段内存空间,假设程序中存在大量值相同的字符串,系统就不得不为每个字符串重复地分配内存空间,显然,对系统来说是一种资源浪费。为了解决这种问题,Python 针对字符串引入了 intern 机制。

再来看:

>>> s3 = intern('hello!')>>> s4 = intern('hello!')>>> s3 is s4True>>> id(s3)80325968L>>> id(s4)80325968L

intern 是 Python 中的一个内建函数,该函数的作用就是对字符串进行 intern 机制处理,处理后返回字符串对象。我们发现但凡是值相同的字符串经过 intern 机制处理之后,返回的都是同一个字符串对象,这种方式在处理大数据的时候无疑能节省更多的内存空间,系统无需为相同的字符串重复分配内存,对于值相同的字符串共用一个对象即可。

其实,实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果还没加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取,用伪代码就可以描述为:

intern_pool = {}def intern(s):

if s in intern_pool: return intern_pool[s] else:

obj = PyStringObject(s)

intern_pool[s] = obj return obj

在主流面向对象的编程语言中,字符串的 intern 机制对于高效处理字符串已经成为一种标配,通过 intern 机制可以提高字符串的处理效率,当然,解释器内部很对 intern 机制的使用策略是有考究的,有些场景会自动使用 intern ,有些地方需要通过手动方式才能启动。比如:

>>> s1 = "hello">>> s2 = "hello">>> s1 is s2True>>> id(s1)72320704L>>> id(s2)72320704L

这段代码就是 Python 自动使用了intern机制的结果。

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python 常见的应用领域,及应用领域内所用工具
下一篇:一个Python包,学会所有基础算法

2021年Python全套免费视频教程在哪里?

Python编程学习路线

Python最高有几级?

人工智能与语音遥控的区别?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省