Python在什么時候會生成pyc文件呢?
??事情大概是這樣的琅拌,之前我一直以為python文件在執(zhí)行過之后就會生成pyc文件缨伊,后來一次偶然情況下,發(fā)現(xiàn)還是自己too young too simple,在看過其他大神文章并且自己驗證之后进宝,發(fā)現(xiàn)還是有點意思的刻坊,權(quán)當沒事寫點文章吧。
什么是pyc文件呢党晋?
??簡單來說谭胚,pyc文件就是Python的字節(jié)碼文件,我們都知道Python是一種全平臺的解釋性語言未玻,全平臺其實就是Python文件在經(jīng)過解釋器解釋之后(或者稱為編譯)生成的pyc文件可以在多個平臺下運行漏益,這樣同樣也可以隱藏源代碼。其實深胳,Python是完全面向?qū)ο蟮恼Z言绰疤,Python文件在經(jīng)過解釋器解釋后生成字節(jié)碼對象PyCodeObject,pyc文件可以理解為是PyCodeObject對象的持久化保存方式舞终。
什么時候會生成pyc文件呢轻庆?
??pyc文件只有在文件被當成模塊導(dǎo)入時才會生成。也就是說敛劝,Python解釋器認為余爆,只有import進行的模塊才需要被重用。 生成pyc文件的好處顯而易見夸盟,當我們多次運行程序時蛾方,不需要重新對該模塊進行重新的解釋。主文件一般只需要加載一次不會被其他模塊導(dǎo)入,所以一般主文件不會生成pyc文件桩砰。
??下面來舉個例子說明拓春,見代碼
文件print_hello.py
print("hello")
import print_hello
執(zhí)行python print_hello.py
E:\test>python print_hello.py
hello
E:\test>dir
驅(qū)動器 E 中的卷是 文件
卷的序列號是 B612-D1B0
E:\test 的目錄
2017/09/25 21:09 <DIR> .
2017/09/25 21:09 <DIR> ..
2017/09/25 21:08 18 import_hello.py
2017/09/25 21:08 14 print_hello.py
2 個文件 32 字節(jié)
2 個目錄 49,367,699,456 可用字節(jié)
可以發(fā)現(xiàn)并沒有pyc文件生成,
執(zhí)行python import_hello.py
E:\test>python import_hello.py
hello
E:\test>dir
驅(qū)動器 E 中的卷是 文件
卷的序列號是 B612-D1B0
E:\test 的目錄
2017/09/25 21:12 <DIR> .
2017/09/25 21:12 <DIR> ..
2017/09/25 21:08 18 import_hello.py
2017/09/25 21:08 14 print_hello.py
2017/09/25 21:12 124 print_hello.pyc
3 個文件 156 字節(jié)
2 個目錄 49,367,699,456 可用字節(jié)
需要說明兩點的是:
- 執(zhí)行python import_hello.py亚隅,開始執(zhí)行import print_hello硼莽,導(dǎo)入print_hello模塊,然后執(zhí)行了print_hello模塊里面的代碼煮纵,所以我們可以看到有“hello”輸出懂鸵;
- 如果不想執(zhí)行里面的代碼,一般可以將代碼封裝在一個類或者函數(shù)里面行疏,然后加個if判斷匆光,類似下面這樣,表示如果是被導(dǎo)入則不執(zhí)行if下的代碼酿联,如果作為程序入口或者腳本執(zhí)行终息,則執(zhí)行if下的代碼。
if __name__ == "__main__":
print("hello")
pyc文件的過期時間
- 在生成pyc文件的同時货葬,寫入了一個Long型的變量采幌,用于記錄最近修改的時間;
- 每次載入之前都先檢查一下py文件和pyc文件的最后修改日期震桶,如果不一致則會生成一個新的pyc文件
總結(jié)
??總的來說休傍,了解pyc其實對于Python開發(fā)者來說并沒有多大的意義,本著鉆研的精神寫下這篇文章蹲姐,感覺有一下幾點可以考慮
- Python的pyc文件從一定意義上可以減少解釋器解釋Python文件的時間磨取,不必每次都要解釋編譯一遍,方便下次快速加載柴墩,有點類似數(shù)據(jù)庫的緩存吧忙厌;
- 想想如果我們想設(shè)計一個系統(tǒng),類似主文件這種不會被重用江咳,而其他模塊可能會被重用逢净,我們就需要分開設(shè)計對待了吧;
- 在設(shè)計緩存系統(tǒng)時候歼指,類似Python這種對比最后修改時間的方式爹土,是不是可以給我們一點啟示呢?