社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python之禅 • 6 年前 • 541 次点击  

题图:Photo by zane carter on Unsplash


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

先来看一段代码:

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


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

再来看:

>>> s3 = intern('hello!')
>>> s4 = intern('hello!')
>>> s3 is s4
True
>>> 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 s2
True
>>> id(s1)
72320704L
>>> id(s2)
72320704L


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

关注python之禅,提高Python技能


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/EVDjIDfC3O
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2991
 
541 次点击