首頁 > 後端開發 > Python教學 > 為什麼 Python 緩存一些整數而不緩存其他整數?

為什麼 Python 緩存一些整數而不緩存其他整數?

Patricia Arquette
發布: 2024-12-25 17:22:09
原創
623 人瀏覽過

Why Does Python Cache Some Integers But Not Others?

解譯器維護的整數快取是怎麼回事?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板