Python模塊搜索路徑
當(dāng)一個(gè)名為 spam 的模塊被導(dǎo)入的時(shí)候,解釋器首先尋找具有該名稱的內(nèi)置模塊。如果沒(méi)有找到,然后解釋器從 sys.path 變量給出的目錄列表里尋找名為 spam.py 的文件。sys.path 初始有這些目錄地址:
包含輸入腳本的目錄(或者未指定文件時(shí)的當(dāng)前目錄)。
PYTHONPATH (一個(gè)包含目錄名稱的列表,它和shell變量 PATH 有一樣的語(yǔ)法)。
取決于安裝的默認(rèn)設(shè)置
注解 在支持符號(hào)鏈接的文件系統(tǒng)上,包含輸入腳本的目錄是在追加符號(hào)鏈接后才計(jì)算出來(lái)的。換句話說(shuō),包含符號(hào)鏈接的目錄并 沒(méi)有 被添加到模塊的搜索路徑上。
在初始化后,Python程序可以更改 sys.path。包含正在運(yùn)行腳本的文件目錄被放在搜索路徑的開(kāi)頭處, 在標(biāo)準(zhǔn)庫(kù)路徑之前。這意味著將加載此目錄里的腳本,而不是標(biāo)準(zhǔn)庫(kù)中的同名模塊。 除非有意更換,否則這是錯(cuò)誤。更多信息請(qǐng)參閱?python標(biāo)準(zhǔn)模塊。
“編譯過(guò)的”P(pán)ython文件
為了加速模塊載入,Python在?pycache?目錄里緩存了每個(gè)模塊的編譯后版本,名稱為 module.version.pyc ,其中名稱中的版本字段對(duì)編譯文件的格式進(jìn)行編碼; 它一般使用Python版本號(hào)。例如,在CPython版本3.3中,spam.py的編譯版本將被緩存為 __pycache__/spam.cpython-33.pyc。此命名約定允許來(lái)自不同發(fā)行版和不同版本的Python的已編譯模塊共存。
Python根據(jù)編譯版本檢查源的修改日期,以查看它是否已過(guò)期并需要重新編譯。這是一個(gè)完全自動(dòng)化的過(guò)程。此外,編譯的模塊與平臺(tái)無(wú)關(guān),因此可以在具有不同體系結(jié)構(gòu)的系統(tǒng)之間共享相同的庫(kù)。
Python在兩種情況下不會(huì)檢查緩存。首先,對(duì)于從命令行直接載入的模塊,它從來(lái)都是重新編譯并且不存儲(chǔ)編譯結(jié)果;其次,如果沒(méi)有源模塊,它不會(huì)檢查緩存。為了支持無(wú)源文件(僅編譯)發(fā)行版本, 編譯模塊必須是在源目錄下,并且絕對(duì)不能有源模塊。
給專業(yè)人士的一些小建議:
你可以在Python命令中使用 -O 或者 -OO 開(kāi)關(guān), 以減小編譯后模塊的大小。 -O 開(kāi)關(guān)去除斷言語(yǔ)句,-OO 開(kāi)關(guān)同時(shí)去除斷言語(yǔ)句和?doc?字符串。由于有些程序可能依賴于這些,你應(yīng)當(dāng)只在清楚自己在做什么時(shí)才使用這個(gè)選項(xiàng)。“優(yōu)化過(guò)的”模塊有一個(gè) opt- 標(biāo)簽并且通常小些。將來(lái)的發(fā)行版本或許會(huì)更改優(yōu)化的效果。
一個(gè)從 .pyc 文件讀出的程序并不會(huì)比它從 .py 讀出時(shí)運(yùn)行的更快,.pyc 文件唯一快的地方在于載入速度。
compileall 模塊可以為一個(gè)目錄下的所有模塊創(chuàng)建.pyc文件。
關(guān)于這個(gè)過(guò)程,PEP 3147 中有更多細(xì)節(jié),包括一個(gè)決策流程圖。
緩存 Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。