爲了提升加載模塊的速度,強調強調強調:提升的是加載速度而絕非運行速度。python解釋器會在__pycache__目錄中下緩存每一個模塊編譯後的版本,格式爲:module.version.pyc。一般會包含python的版本號。例如,在CPython3.3版本下,spam.py模塊會被緩存成__pycache__/spam.cpython-33.pyc。這種命名規範保證了編譯後的結果多版本共存。html
Python檢查源文件的修改時間與編譯的版本進行對比,若是過時就須要從新編譯。這是徹底自動的過程。而且編譯的模塊是平臺獨立的,因此相同的庫能夠在不一樣的架構的系統之間共享,即pyc使一種跨平臺的字節碼,相似於JAVA火.NET,是由python虛擬機來執行的,可是pyc的內容跟python的版本相關,不一樣的版本編譯後的pyc文件不一樣,2.5編譯的pyc文件不能到3.5上執行,而且pyc文件是能夠反編譯的,於是它的出現僅僅是用來提高模塊的加載速度的,不是用來加密的。python
# python解釋器在如下兩種狀況下不檢測緩存 1. 若是是在命令行中被直接導入模塊,則按照這種方式,每次導入都會從新編譯,而且不會存儲編譯後的結果(python3.3之前的版本應該是這樣) python -m spam.py 2. 若是源文件不存在,那麼緩存的結果也不會被使用,若是想在沒有源文件的狀況下來使用編譯後的結果,則編譯後的結果必須在源目錄下 sh-3.2 # ls __pycache__ spam.py sh-3.2 # rm -rf spam.py sh-3.2 # mv __pycache__/spam.cpython-36.pyc ./spam.pyc sh-3.2 # python3 spam.pyc spam # 提示: 1. 模塊名區分大小寫,foo.py與FOO.py表明的是兩個模塊 2. 你可使用-O或者-OO轉換python命令來減小編譯模塊的大小 -O轉換會幫你去掉assert語句 -OO轉換會幫你去掉assert語句和__doc__文檔字符串 因爲一些程序可能依賴於assert語句或文檔字符串,你應該在在確認須要 的狀況下使用這些選項。 3. 在速度上從.pyc文件中讀指令來執行不會比從.py文件中讀指令執行更快,只有在模塊被加載時,.pyc文件纔是更快的 4. 只有使用import語句是纔將文件自動編譯爲.pyc文件,在命令行或標準輸入中指定運行腳本則不會生成這類文件,於是咱們可使用compieall模塊爲一個目錄中的全部模塊建立.pyc文件 模塊能夠做爲一個腳本(使用python -m compileall)編譯Python源 python -m compileall /module_directory 遞歸着編譯 若是使用python -O -m compileall /module_directory -l則只一層 命令行裏使用compile()函數時,自動使用python -O -m compileall 詳見:https://docs.python.org/3/library/compileall.html#module-compileall
二丶批量生產.pyc文件緩存
import compileall compileall.compile_dir('$dir')
其中,$dir 爲Python源代碼所在的目錄。架構