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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM