標籤:儲存 刪除 轉換 運行程式 意思 func 環境 內容 速度
今天編寫程式時,發現了一個有趣的現象。當執行import語句時,運行以後,將會指令碼目錄下產生一個__pycache__檔案。於是做了如下總結解釋:
一. python基本運行機制
Python程式運行時不需要編譯成二進位代碼,而直接從源碼運行程式,簡單來說是,Python解譯器將源碼轉換為位元組碼,然後再由解譯器來執行這些位元組碼。
解譯器的具體工作:
1 完成模組的載入和連結;
2 將原始碼編譯為PyCodeObject對象(即位元組碼),寫入記憶體中,供CPU讀取;
3 從記憶體中讀取並執行,結束後將PyCodeObject寫回硬碟當中,也就是複製到.pyc或.pyo檔案中,以儲存目前的目錄下所有指令碼的位元組碼檔案;
* 之後若再次執行該指令碼,它先檢查【本地是否有上述位元組碼檔案】和【該位元組碼檔案的修改時間是否與其指令碼一致】。是就直接執行,否則重複上述步驟。
二. 為何會出現該檔案
python解譯器會將 *.py 指令檔進行編譯,並將編譯結果儲存到__pycache__目錄中。
下次再執行工程時,若解譯器發現這個 *.py 指令碼沒有修改過,就會跳過編譯這一步,直接運行以前產生的儲存在 __pycache__檔案夾裡的 *.pyc 檔案。
這樣工程較大時就可以大大縮短項目運行前的準備時間;如果你只需執行一個小工程,沒關係 忽略這個檔案夾就行。
三. 如何使該檔案不出現
1. 單次關閉: 運行指令碼時添加 -B 參數即可
2. 永久關閉: 設定環境變數 PYTHONDONTWRITEBYTECODE=1 即可
四. 解釋下該檔案的內容
該檔案裡有大小隨時變化的類似格式random_walk.cpython-37.pyc檔案,點號中的第一位代表被inport進來的模板。cpython-37,cpython代表的是c語言實現的Python解譯器,-37代表的是版本為3.7版。
五. 模組調用
Python中匯入模組時,實際上會把被匯入的模組執行一遍,如下:
先看被調用的模組test.py:
def haha(): print("哈哈")haha()
再看主程式main.py:
import testprint("一條魚")
執行結果是:
哈哈一條魚
那怎麼才能只是單純調用而不執行被調用模組的代碼呢?要想被調用模組代碼不被執行,前提得知道變數__name__是什麼意思,簡單來說就是,如果不涉及模組匯入的話,__name__的值就是” __main__“,如果當此模組被匯入引用的話,那麼這個模組內的__name__值就是檔案的名字(不帶.py),如下test_1.py:
def haha(): print("哈哈")haha()print(__name__)
test_1.py執行結果為:
哈哈__main__
如果test_1被匯入引用的話,如test_2:
import test_1print("一條魚")
test_2x運行結果為:
哈哈test_1一條魚
上邊所說要是弄懂的話,那我們在被調用的模組中,可執行檔代碼前加上這麼一句判斷,if __name__ == ‘__main__‘:,被調用的模組的代碼就不會被執行了!或者再啟動的時候添加選項參數。這個檔案時可以刪除的,不過刪除意義不大。反而存在的話,載入會更快。
note: pyo和.pyc檔案的執行速度不會比.py檔案快,快的地方在於模組載入的速度
參考文獻:
79023987
https://www.cnblogs.com/Ralph-Wang/archive/2013/11/23/3439080.html
https://jingyan.baidu.com/article/c14654134a7bdd0bfcfc4cea.html
python項目---資料視覺效果(02)