1. 程式人生 > 程式設計 >淺析Python中字串的intern機制

淺析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機制的資料請關注我們其它相關文章!