Python中的字串駐留機制
阿新 • • 發佈:2020-12-13
字串駐留機制(引用計數機制):
字串駐留是一種在記憶體中僅儲存一份相同且不可變字串的方法。 系統維護interned字典,記錄已被駐留的字串物件。 對於短字串,將其賦值給多個不同的物件時,記憶體中只有一個副本,多個物件共享該副本。長字串不遵守駐留機制 。 python的引用計數機制,並不是對所有的數字,字串,它只對“[0-9] [a-z] [A-Z]和"_"(下劃線)”有效,當字串中由其他字元比如“! @ # ¥ % -”時字元駐留機制是不起作用的。駐留適用範圍:
例子1:帶下劃線(_)
- 字串長度為0或1時,預設採用駐留機制;
- 字串長度大於1時,且 字串中只包含大小寫字母、數字、下劃線(_) 時,採用駐留機制;
- 對於 [-5,256]之間的整數數字,Python預設駐留 ;
- 字串 只在編譯時進行駐留,而非執行時 。Python是解釋型語言,但是事實上,它的直譯器也可以是理解為是一種編譯器,它負責將Python程式碼翻譯成位元組碼,也就是.pyc檔案;
- 用乘法得到的字串,如果結果長度 <=20且字串只包含數字、字母大小寫、下劃線,支援駐留。長度>20,不支援駐留。這樣的設計目的是為了保護.pcy檔案不會被錯誤程式碼搞的過大。
例子2:帶空格字元>>> str1='sten_waves' >>> str2='sten_waves' >>> str1 is str2 True >>> id(str1) 2072034398512 >>> id(str2) 2072034398512
>>> 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
注: 1、Pyhton提供intern方法強制2個字串指向同一個物件 。
- python識別符號的不可變性導致了字串的改動不是採用replace,而是重新建立物件。 為了節省記憶體,設計字串的改動通常用join()而非+,因為+會多次建立物件,而join()只建立一次物件。
- 駐留機制會提升一些時間和空間上的效能,但駐留物件也有所消耗。
>>>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中整型物件儲存的位置