為了提高模塊加載的速度,每個模塊都會在 __pycache__
文件夾中放置該模塊的預編譯模塊,命名為 module.version.pyc
, version
是模塊的預編譯版本編碼,一般都包含 Python 的版本號。例如在 CPython 發行版 3.4 中,fibo.py
文件的預編譯文件就是:__pycache__/fibo.cpython-34.pyc
。這種命名規則可以保證不同版本的模塊和不同版本的 python 編譯器的預編譯模塊可以共存。
腳本在運行之前會首先檢查 python 文件的最后編輯日期和預編譯模塊的編譯時間,從而決定是否需要重新編譯。預編譯模塊也是跨平台的,所以不同的模塊是可以在不同的系統和不同的架構之間共享的。
Python 在兩種情況下不檢查緩存。第一種,從命令行中直接加載的模塊總是會重新編譯並且結果不保存。第二種,如果沒有源模塊,則不會檢查緩存。為了支持無源代碼的部署方式,應該將預編譯模塊放在源代碼文件夾中而不是 __pycache__
中,並且不要包含源代碼模塊。
你可以使用 -O
和 -OO
參數來降低預編譯模塊的大小。-O
開關會去除 assert
語句,-OO
開關會去除 assert
語句和 __doc__
字符串。因為有些模塊要依賴這些語句,因此只有當你確認模塊的內容時才去使用這些開關。優化模塊的后綴名是 .pyo
。
.pyo
和 .pyc
文件的執行速度不會比 .py
文件快,快的地方在於模塊加載的速度。
compileall 模塊可以用來把某個文件夾的中的所有文件都編譯成為 .pyc
或者 .pyo
文件。