python 字符串的驻留机制及优缺点

说明

字符串驻留是一种仅保存一份相同且不可变字符串的方法。不同的值被存放在字符串驻留池中,发生驻留之后, 许多变量可能指向内存中的相同字符串对象, 从而节省内存.

原理

  • 系统维护interned字典,记录已被驻留的字符串对象
  • 当字符串对象a需要驻留时,先在interned检测是否存在,若存在则指向存在的字符串对象,a的引用计数减1
  • 若不存在,则记录a到interned中

驻留时机

  1. 所有长度为 0 和长度为 1 的字符串都被驻留
  2. 字符串只在编译时进行驻留,而非运行时
a = 'hi' # a变量被驻留
b = ''.join(['h', 'i']) # 变量不会被驻留
print(a is b) # False

3.字符串中只包含字母,数字或下划线时将会驻留

a = 'hello'
	b = 'hello'
	print(a is b) # True

	a = 'hello!'
	b = 'hello!'
	print(a is b) # False
	```

常量折叠是 Python 中的一种 窥孔优化技术. 这意味着在编译时表达式 ‘a'*20 会被替换为 ‘aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期. 只有长度小于 20 的字符串才会发生常量折叠.样的设计目的是为了保护.pcy文件不会被错误代码搞的过大

a = 'a' * 10
b = 'aaaaaaaaaa'
print(a is b) # True

a = 'a' * 21
b = 'aaaaaaaaaaaaaaaaaaaaa'
print(a is b) #False

字符串驻留机制的优缺点

优点:能够提高一些字符串处理任务在时间和空间上的性能,非驻留比较效率为o(n),驻留时比较效率为o(1)
缺点:在创建或驻留字符串时的会花费更多的时间

总结

到此这篇关于python 字符串的驻留机制的文章就介绍到这了,更多相关python字符串驻留内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python如何实现在字符串里嵌入双引号或者单引号

    两种方法实现: 1.在双引号前面加个转义符 \ ,即反斜杠.如"Hello \"W \"orld",会输出 Hello "W"orld 2.用单引号引起整个字符串,如'Hello "W"orld',同样输出 Hello "W"orld 同理也可以在字符串里嵌入单引号,如"Hello 'W'orld",输出 Hello 'W'orld 补充拓展:python中单引号(').双引号(&quo

  • Python读取文件内容为字符串的方法(多种方法详解)

    以下笔记是我在 xue.cn 学习群之数据分析小组所整理分享的心得.相关背景是:我选择中文词频统计案例作为考察大家python基础功掌握程度. 以小见大,下面是2个小技能的具体实战: 如何灵活地处理文件读取 如何把数据处理为自己想要的数据类型 方法1: 拷贝文章时,直接把内容赋值给一个变量,保存到一个 .py 文件中.然后在脚本中,导入它. 存储文章的文件 article.py content = """ 复制的文章内容 """ 存储脚本的文件 

  • Python中的 is 和 == 以及字符串驻留机制详解

    is 和 == 先了解下官方文档中关于 is 和 == 的概念.is 表示的是对象标示符(object identity),而 == 表示的是相等(equality):is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样(相当于检查 id(a) == id(b)),而 == 是用来检查两个对象引用的值是否相等(相当于检查 a.eq(b)):这点和Java有点类似,只不过Java中是用 == 来比较两个对象在内存中的地址,用 equals() 来检查两者之间的值是否

  • python不相等的两个字符串的 if 条件判断为True详解

    今天遇到一个非常基础的问题,结果搞了好久好久.....赶快写一篇博客记录一下: 本来两个不一样的字符串,在if 的条件判断中被判定为True,下面是错误的代码: test_str = 'happy' if test_str == 'good' or 'happy': #这样if判断永远是True,写法错误 print('aa') else: print('bbbb') 这是正确的代码: test_str = 'happy' if test_str == 'good' or test_str ==

  • Python 去除字符串中指定字符串

    1.背景 最近的项目中,再次踩到Python字符串处理的坑,决定把此次解决方案记录一下,以勿踩坑. 2.遇到坑 原本字符串:大坪英利国际8号楼88-88号重庆汉乔科技有限公司大坪英利国际8号楼 去除最左边的字符串:大坪英利国际8号楼 预期结果:88-88号重庆汉乔科技有限公司大坪英利国际8号楼 自然而然,第一个想到的就是lstrip()函数. Python中lstrip() 方法用于截掉字符串左边的空格或指定字符. 但实际上结果: lstrip: -88号重庆汉乔科技有限公司大坪英利国际8号楼

  • python 字符串的驻留机制及优缺点

    说明 字符串驻留是一种仅保存一份相同且不可变字符串的方法.不同的值被存放在字符串驻留池中,发生驻留之后, 许多变量可能指向内存中的相同字符串对象, 从而节省内存. 原理 系统维护interned字典,记录已被驻留的字符串对象 当字符串对象a需要驻留时,先在interned检测是否存在,若存在则指向存在的字符串对象,a的引用计数减1 若不存在,则记录a到interned中 驻留时机 所有长度为 0 和长度为 1 的字符串都被驻留 字符串只在编译时进行驻留,而非运行时 a = 'hi' # a变量被

  • C#字符串内存驻留机制分析

    在这之前我写过一些文章来介绍关于字符串内存分配和驻留的文章,涉及到的观点主要有:字符串的驻留机制避免了对具有相同字符序列的字符串对象的重复创建:被驻留的字符串是不受GC管辖的,即被驻留的字符串对象不能被GC回收:被驻留的字符串是被同一进程中所有应用程序域共享的.至于具体的原因,相信在<关于CLR内存管理一些深层次的讨论>中,你可以找到答案.由于这些天来在做一些关于内存泄露审查的工作,所以想通过具体的Memory Profiling工具来为你证实上面的结论.我采用的Memory Profilin

  • 字符串内存驻留机制详解示例

    复制代码 代码如下: //字符串的内存驻留机制        public static void Test()        {            //当有多个字符串变量包含了同样的字符串实际值时,            //CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例. String s1 = "Hello";            String s2 = "Hello";            bool same = (obj

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

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

  • python字符串常见使用操作方法介绍

    目录 1.字符串的驻留机制 2.什么叫字符串的驻留机制 3.字符串驻留机制的优缺点 4.字符串的查询操作的方法 4.1字符串的大小写转换操作的方法 4.2字符串内容对其操作和方法 4.3判断字符串的方法 4.4字符串的比较操作 5.格式化字符串 6.字符串的编码转换 1.字符串的驻留机制 字符串: 在Python中字符串是基本的数据类型,是一个不可变的字符序列 2.什么叫字符串的驻留机制 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同的字符串只

  • Python字符串的创建和驻留机制详解

    目录 字符串 字符串驻留机制 字符串驻留机制优缺点 字符串 字符串在Python中是基本数据类型,是一个不可变的字符序列. 字符串驻留机制 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量. 驻留机制的几种情况(交互模式windows+r,cmd) 1.字符串的长度为0或1时 2.符合标识符的字符串 3.字符串只在编译时进行驻留,而非运行时 b在运行

  • python字符串驻留机制的使用范围知识点详解

    1.字符串的长度为0和1时. 2.符合标识符的字符串. 3.字符串只在编译时进行驻留,而非运行时. 4.[-5,256]之间的整数数字. 实例 >>> str1='jiumo' >>> str2='jiumo' >>> str1 is str2 True >>> id(str1) 1979078421896 >>> id(str2) 1979078421896 知识点扩充: 驻留时机 所有长度为 0 和长度为 1 的

  • 详解Python中神奇的字符串驻留机制

    目录 1 什么是字符串驻留机制 2 如何使用字符串驻留机制 3 简单拼接驻留, 运行时不驻留 4 总结 5 全部代码 今天有一个初学者在学习Python的时候又整不会了. 原因是以下代码: a = [1, 2, 3] b = [1, 2, 3] if a is b: print("a and b point to the same object") else: print("a and b point to different objects") 运行结果是a an

  • python字符串Intern机制详解

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

随机推荐