1. 程式人生 > 其它 >Python中的字串駐留機制

Python中的字串駐留機制

技術標籤:pythonpython駐留機制

字串駐留機制(引用計數機制):

字串駐留是一種在記憶體中僅儲存一份相同且不可變字串的方法。 系統維護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/81879668Python中的字串駐留機制

https://www.jianshu.com/p/9660f399ac98Python的字串駐留機制

https://blog.csdn.net/weixin_43336281/article/details/106053852理解Python中整型物件儲存的位置