解譯器維護的整數快取是怎麼回事?
Python 在將相同的文字編譯成相同的程式碼物件時會對其進行最佳化,從而產生物件具有相同的身份。通常,[-5, 256] 範圍內的整數會被緩存,但這並不能保證該範圍內的所有整數都具有相同的標識。
在您提供的範例程式碼中,當您執行每一行時在 Python shell 中分別進行:
>>> a = 1 >>> b = 1 >>> a is b True
每行程式碼都是單獨解析和編譯的。但是,當您在檔案中一起運行相同的程式碼時:
>>> a = 257; b = 257; a is b True
編譯器可以最佳化文字。在編譯過程中,AST 會轉換為字節碼,編譯器會分析文字的用法以避免重複。這會在編譯的程式碼中產生整數 257 的單一常數。
這種最佳化不僅限於整數,也適用於其他文字,例如浮點數。但是,它不適用於元組等更複雜的文字,其中元組內的文字是單獨最佳化的。
您觀察到建立兩個 PyInt_Object 的原因可能是由於解析器將文字轉換為整數的方法。解析器使用函數將文字轉換為整數值,然後呼叫 PyLong_FromString 建立整數物件。這種方法避免了重寫轉換程式碼,並且可以輕鬆擴展。
但是,確保相等常數使用相同物件的最終最佳化發生在字節碼編譯期間,而不是 AST 轉換期間。具體來說,compiler_add_o 函數負責將常數儲存在字典物件中,從而導致相同的常數落入同一個槽中,並在最終字節碼中由單一常數表示。
以上是為什麼 Python 緩存一些整數而不緩存其他整數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!