python中__pycache__文件夾的產生與作用

模塊的調用
Python中導入模塊時,實際上會把被導入的模塊執行一遍,如下: 
先看被調用的模塊test.py:

def haha():
    print("哈哈")

haha()

再看主程序main.py:

import test

print("一條大樹")

執行結果是:

哈哈
一條大樹

那怎麼才能只是單純調用而不執行被調用模塊的代碼呢?要想被調用模塊代碼不被執行,前提得知道變量__name__是什麼意思,簡單來說就是,如果不涉及模塊導入的話,__name__的值就是” __main__“,如果當此模塊被導入引用的話,那麼這個模塊內的__name__值就是文件的名字(不帶.py),如下test_1.py:

def haha():
    print("哈哈")

haha()
print(__name__)

test_1.py執行結果爲:

哈哈
__main__

如果test_1被導入引用的話,如test_2:

import test_1

print("一條大樹")

test_2x運行結果爲:

哈哈
test_1
一條大樹

上邊所說要是弄懂的話,那我們在被調用的模塊中,可執行的代碼前加上這麼一句判斷,if __name__ == '__main__':,被調用的模塊的代碼就不會被執行了!

接下來纔是正題
以下參考自Joy_Shen的一個回答。 
先大概瞭解一下python基本運行機制。Python程序運行時不需要編譯成二進制代碼,而直接從源碼運行程序,簡單來說是,Python解釋器將源碼轉換爲字節碼,然後再由解釋器來執行這些字節碼。

解釋器的具體工作: 
1、完成模塊的加載和鏈接; 
2、將源代碼編譯爲PyCodeObject對象(即字節碼),寫入內存中,供CPU讀取; 
3、從內存中讀取並執行,結束後將PyCodeObject寫回硬盤當中,也就是複製到.pyc或.pyo文件中,以保存當前目錄下所有腳本的字節碼文件。

之後若再次執行該腳本,它先檢查【本地是否有上述字節碼文件】和【該字節碼文件的修改時間是否在其源文件之後】,是就直接執行,否則重複上述步驟。

那有的小夥伴就有疑問了,__pycache__文件夾的意義何在呢? 
因爲第一次執行代碼的時候,Python解釋器已經把編譯的字節碼放在__pycache__文件夾中,這樣以後再次運行的話,如果被調用的模塊未發生改變,那就直接跳過編譯這一步,直接去__pycache__文件夾中去運行相關的 *.pyc 文件,大大縮短了項目運行前的準備時間。
--------------------- 
作者:yitiaodashu 
來源:CSDN 
原文:https://blog.csdn.net/yitiaodashu/article/details/79023987 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章