浅析Python中字符串的intern机制

intern机制:

  字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

简单原理:

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

但是,解释器内部对intern 机制的使用策略是有考究的,有些场景会自动使用intern ,有些地方需要通过手动方式才能启动,看下面几个常见的小陷阱。

  • 1.在shell中示例,并非全部的字符串都会采用intern机制。仅仅包括下划线、数字、字母的字符串才会被intern,当然不能超过20个字符。因为如果超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中。
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True# 如果有空格,默认不启用intern机制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False# 如果一个字符串长度超过20个字符,不启动intern机制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True
>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False
>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True
>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False
  • 2.但是在PyCharm中,只要是同一个字符串不超过20个字符,都为True,并不用是下划线、数字、字母的字符串。个人理解:IDE支持的不好。
s1 = "hell o"
s2 = "hell o"
print(s1 is s2) # True
s1 = "hell!*o"
s2 = "hell!*o"
print(s1 is s2) # True
s1 = "a" * 20
s2 = "a" * 20
print(s1 is s2) # True
s1 = "a" * 21
s2 = "a" * 21
print(s1 is s2) # False
s1 = "ab" * 10
s2 = "ab" * 10
print(s1 is s2) # True
s1 = "ab" * 11
s2 = "ab" * 11
print(s1 is s2) # False
  • 3.字符串拼接时,涉及编译运行问题
>>> s1 = "hell"
>>> s2 = "hello"
>>> s1 + "o" is s2
False
>>> "hell" + "o" is s2
True
>>>
# 说明shell和IDE在这方面没有差异
s1 = "hell"
s2 = "hello"
print(s1 + "o" is s2) # False
print("hell" + "o" is s2) # True#因为"hell" + "o"在编译时已经变成了"hello",而s1+"o"因为s1是一个变量,他们会在运行时进行拼接,所以没有被intern

作者:Nobita Chen
出处:http://www.cnblogs.com/chenshengkai/

以上就是浅析Python中字符串的intern机制的详细内容,更多关于python 字符串的intern机制的资料请关注我们其它相关文章!

(0)

相关推荐

  • python七种方法判断字符串是否包含子串

    1. 使用 in 和 not in in 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符. 使用这两个成员运算符,可以很让我们很直观清晰的判断一个对象是否在另一个对象中,示例如下: >>> "llo" in "hello, python" True >>> >>> "lol" in "hello, python" False 2. 使用

  • Python基于gevent实现文件字符串查找器

    1.递归遍历目录下所有文件并通过finder函数定位指定格式字符串 2.用来查找字符串的finder函数是自己定义的,这里定义了一个ip_port_finder通过正则表达式查找ip:port格式(粗匹配:数字.数字.数字.数字:数字)的字符串 3.用gevent来实现协程并发完成耗时任务 代码如下: # -*- coding: utf-8 -*- import re from os.path import join from os import walk from gevent import

  • 基于python判断字符串括号是否闭合{}[]()

    前言 经典面试题: 判断一个字符串里面的括号是否闭合,如:{{()}} 就是一个闭合的字符串. {{()}]} 这个里面 ([)] 括号不对称,这种就是不闭合. python判断闭合 解决基本思路: 先把左括号添加到一个列表里面,遇到右括号就弹出列表里面的最后一个存放进去的. 对比右括号和弹出的左括号是否对称,如果是就继续依次对比. 最后判断列表里面是否有多余的左括号,如果列表为空,说明全部被弹出,那就是闭合的 最后考虑下左括号和右括号有多余的情况 代码如下 def is_str_close(a

  • python字符串Intern机制详解

    字符串在 Python 中是最简单也是最常用的数据类型之一,在 CPython 中字符串的实现原理使用了一种叫做 Intern(字符串驻留)的技术来提高字符串效率.究竟什么是 intern 机制,这种机制又是通过什么方式来提高字符串效率的呢?希望这篇文章能够抛砖引玉. 先来看一段代码: >>> s3 = "hello!" >>> s4 = "hello!" >>> s3 is s4 False >>&

  • 详解Python3 定义一个跨越多行的字符串的多种方法

     方法一:使用三引号 >>> str1 = '''Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存. (纵有疾风起,人生不言弃.)''' >>> str1 'Le vent se lève, il faut tenter de vivre. \n起风了,唯有努力生存.\n(纵有疾风起,人生不言弃.)' >>> print(str1) Le vent se lève, il faut tenter

  • python判断字符串以什么结尾的实例方法

    函数:endswith() 作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型. 相关函数:判断字符串开头 startswith() 函数说明: 语法: string.endswith(str, beg=[0,end=len(string)]) string[beg:end].endswith(str) 参数说明: string: 被检测的字符串 str:      指定的字符或者子字符串(可以使用元组,会逐一匹配) beg:    设置字符串检测的起始位置(可选,从左数起) en

  • python把一个字符串切开的实例方法

    split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,并返回分割后的字符串列表. 语法: str.split(str="", num=string.count(str)) 参数: str -- 分隔符,默认为所有的空字符,包括空格.换行(\n).制表符(\t)等. num -- 分割次数.默认为 -1, 即分隔所有. 代码示例: #定义一个字符串str1 >>> str1 = "3w.gorly.test

  • Python判断字符串是否为合法标示符操作

    这学期在学习编译原理,最近的上机作业就是做一个简单的词法分析器,在做的过程中,突然有个需求就是判断一个字符串是否为合法的标示符,因为我是用python语言做的,做的是Python的词法分析器,于是下面分享以下怎样判断一个字符串是合法的标示符. 首先,我们来熟悉以下python标示符的定义是什么? 定义:以字母或下划线开始的,由字母,数字或下划线组成,但是不能是python的保留字. 又有疑问了,python有哪些保留字,分别是什么? # python2.x import keyword prin

  • python 字符串格式化的示例

    一.旧式的字符串格式化 % 操作符 参考以下示例: >>> name = "Eric" >>> "Hello, %s." % name 'Hello, Eric.' 当有多个变量需要插入到字符串中时: >>> name = "Eric" >>> age = 74 >>> "Hello, %s. You are %s." % (name,

  • 浅析Python中字符串的intern机制

    intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象. 简单原理: 实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池

  • 浅析Python中的for 循环

    Python for 和其他语言一样,也可以用来循环遍历对象,本文章向大家介绍Python for 循环的使用方法和实例,需要的朋友可与参考一下. 一个循环是一个结构,导致第一个程序要重复一定次数.重复不断循环的条件仍是如此.当条件变为假,循环结束和程序的控制传递给后面的语句循环. for循环: 在Python for循环遍历序列的任何物品,如一个列表或一个字符串,有能力. for循环语法是: for iterating_var in sequence: statements(s) 如果一个序列

  • 浅析python中的分片与截断序列

    序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的第一个元素:且切片不包括右边界,例如[0:3]代表元素0.1.2不包括3. l=['a','b','c','d',5] 1.获取列表的前3个元素 >>> l[0:3] ['a', 'b', 'c'] >>> l[:3] ['a', 'b', 'c'] 2.获取列表的后3个元素 >>> l[-

  • 深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构--进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控

  • python中字符串比较使用is、==和cmp()总结

    经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 Python 确不是这样子的. 所以作为慢慢要转换到用 Python 写脚本,这些基本的东西必须要掌握到骨子里! 在 Python 中比较字符串最好是使用简单逻辑操作符. 例如,确定一个字符串是否和另外一个字符串匹配.正确的,你可以使用 is equal 或 == 操作符.你也可以使用例如 >= 或 < 来确定几个字符串的排列顺序. 从官方文档上看 The operators ``is`` and

  • Python 中字符串拼接的多种方法

    python拼接字符串一般有以下几种方法: ①直接通过(+)操作符拼接 s = 'Hello'+' '+'World'+'!' print(s) 输出结果: Hello World! 使用这种方式进行字符串连接的操作效率低下,因为python中使用 + 拼接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当拼接字符串较多时自然会影响效率. ②通过str.join()方法拼接 strlist=['Hello',' ','World','!'] print(''.join(str

  • 详解Python中字符串前“b”,“r”,“u”,“f”的作用

    1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码. 2.字符串前加 r 例:r"\n\n\n\n" 表示一个普通生字符串 \n\n\n\n,而不表示换行了. 作用: 去掉反斜杠的转移机制. (特殊字符:即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的"\n"表示换行,"\t"

  • 浅析python中的del用法

    del是python关键字,就像def.and.or一样.它不是字典.列表的方法,但是可以用来删除字典.列表的元素. python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于python都是引用,而python有GC机制,所以,del语句作用在变量上,而不是数据对象上. if __name__=='__main__': a=1 # 对象 1 被 变量a引用,对象

  • 浅析Python中的套接字编程

    目录 一.为什么使用套接字 二.什么是套接字 三.如何在Python中实现Socket编程 四.什么是服务器 五.什么是客户端 5.1.Echo Client-Server 5.2.Multiple Communications 六.传输Python对象 6.1.Python pickle模块 6.2.如何使用pickle模块传递python对象结构 一.为什么使用套接字 套接字是网络的基础.它们使在两个不同程序或设备之间的信息传输成为可能.例如,当您打开浏览器时,您作为客户端正在与服务器建立连

  • Python中字符串对象语法分享

    目录 一.字符串的外观 1.字符串字面量 2.字符串与多行注释 3.字符串编码方式 二.字符串对象 1.str 2.str实现原理 3.str中的内置方法 4.字符串切片 前言:前面提到了Python中的数值型内置数据类型,接下来呢我们就着重介绍一下字符串类型.在Python中字符串是一个有序的字符集合,没有独立的字符数据类型,当字符串长度为1时就可以认为其是字符.Python的内置数据类型str用于字符串处理.str对象的值为字符系列字符串是不可变序列. 一.字符串的外观 1.字符串字面量 顾

随机推荐