久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

pyhton中__pycache__文件夾的產(chǎn)生與作用_

 jsdlgx 2020-03-11
展開
源起
今天和一新來的同事溝通,,說他用python編寫了一個工程,但在第一次運行后,,發(fā)現(xiàn)工程根目錄下生成了一個__pycache__文件夾,,里面是和py文件同名的各種以 .cpython-35.pyc 結(jié)尾的文件,問同事都不太清楚,,所以便抽空整理了一下該知識點,。先解釋下cpython-35,cpython代表的是c語言實現(xiàn)的Python解釋器,,-35代表的是版本為3.5版,。 
至于pyc,,先來了解一下模塊的調(diào)用。

模塊的調(diào)用
Python中導(dǎo)入模塊時,,實際上會把被導(dǎo)入的模塊執(zhí)行一遍,,如下: 
先看被調(diào)用的模塊test.py:

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

haha()

再看主程序main.py:

import test

print("一條大樹")

執(zhí)行結(jié)果是:

哈哈
一條大樹

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

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

haha()
print(__name__)

test_1.py執(zhí)行結(jié)果為:

哈哈
__main__

如果test_1被導(dǎo)入引用的話,,如test_2:

import test_1

print("一條大樹")

test_2x運行結(jié)果為:

哈哈
test_1
一條大樹

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

接下來才是正題
以下參考自Joy_Shen的一個回答,。 
先大概了解一下python基本運行機制。Python程序運行時不需要編譯成二進制代碼,,而直接從源碼運行程序,,簡單來說是,Python解釋器將源碼轉(zhuǎn)換為字節(jié)碼,,然后再由解釋器來執(zhí)行這些字節(jié)碼,。

解釋器的具體工作: 
1、完成模塊的加載和鏈接,; 
2,、將源代碼編譯為PyCodeObject對象(即字節(jié)碼),寫入內(nèi)存中,,供CPU讀?。?nbsp;
3,、從內(nèi)存中讀取并執(zhí)行,,結(jié)束后將PyCodeObject寫回硬盤當(dāng)中,也就是復(fù)制到.pyc或.pyo文件中,,以保存當(dāng)前目錄下所有腳本的字節(jié)碼文件,。

之后若再次執(zhí)行該腳本,它先檢查【本地是否有上述字節(jié)碼文件】和【該字節(jié)碼文件的修改時間是否在其源文件之后】,,是就直接執(zhí)行,,否則重復(fù)上述步驟,。

那有的小伙伴就有疑問了,__pycache__文件夾的意義何在呢,? 
因為第一次執(zhí)行代碼的時候,,Python解釋器已經(jīng)把編譯的字節(jié)碼放在__pycache__文件夾中,這樣以后再次運行的話,,如果被調(diào)用的模塊未發(fā)生改變,,那就直接跳過編譯這一步,直接去__pycache__文件夾中去運行相關(guān)的 *.pyc 文件,,大大縮短了項目運行前的準備時間,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多