Python中的字符串驻留机制

 

字符串驻留机制(引用计数机制):

    字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法。
    系统维护interned字典,记录已被驻留的字符串对象。
    对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制
    
    python的引用计数机制,并不是对所有的数字,字符串,它只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的。
 
驻留适用范围:
  1. 字符串长度为0或1时,默认采用驻留机制;
  2. 字符串长度大于1时,且 字符串中只包含大小写字母、数字、下划线(_) 时,采用驻留机制;
  3. 对于 [-5,256]之间的整数数字,Python默认驻留
  4. 字符串 只在编译时进行驻留,而非运行时 。Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件;
  5. 用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。
 
例子1:带下划线(_)
>>> str1='sten_waves'
>>> str2='sten_waves'
>>> str1 is str2
True
>>> id(str1)
2072034398512
>>> id(str2)
2072034398512

 

例子2:带空格字符
>>> str3='sten waves'
>>> str4='sten waves'
>>> str3 is str4
False
>>> id(str3)
2072034399920
>>> id(str4)
2072034399856

例子1与例子2可以看出,非数字、字符串、下划线(_)组成的字符串不会触发驻留。

 
 
驻留时机:
python中的驻留发生在compile_time,而不是run_time。
>>> str1='sten'+'waves'  # compile_time
>>> str1 is 'stenwaves'
True

>>> str3='sten'
>>> str4=str3+'waves'
>>> str4 is 'stenwaves'  # run_time
False

 

优缺点:
  • python标识符的不可变性导致了字符串的改动不是采用replace,而是重新创建对象。 为了节省内存,设计字符串的改动通常用join()而非+,因为+会多次创建对象,而join()只创建一次对象。
  • 驻留机制会提升一些时间和空间上的性能,但驻留对象也有所消耗。
 
注:
1、Pyhton提供intern方法强制2个字符串指向同一个对象
>>> import sys
>>> a="a*&&"
>>> b="a*&&"
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True

2、Python中整型对象存储的位置

在python中,整形对象存储的位置有所不同,有些整形是预先分配的,一致在内存里,而其他的则在使用时开辟空间。

对于[-5,256]之间的整数数字,Python默认驻留,即预先在内存中分配

 
 

参考:

https://blog.csdn.net/stenwaves/article/details/81879668 Python中的字符串驻留机制

https://www.jianshu.com/p/9660f399ac98  Python的字符串驻留机制

https://blog.csdn.net/weixin_43336281/article/details/106053852  理解Python中整型对象存储的位置

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值