Python在何時會生成pyc文件呢?

Python在何時會生成pyc文件呢?

  事情大概是這樣的,以前我一直覺得python文件在執行過以後就會生成pyc文件,後來一次偶然狀況下,發現仍是本身too young too simple,在看過其餘大神文章而且本身驗證以後,發現仍是有點意思的,權當沒事寫點文章吧。python

什麼是pyc文件呢?

  簡單來講,pyc文件就是Python的字節碼文件,咱們都知道Python是一種全平臺的解釋性語言,全平臺其實就是Python文件在通過解釋器解釋以後(或者稱爲編譯)生成的pyc文件能夠在多個平臺下運行,這樣一樣也能夠隱藏源代碼。其實,Python是徹底面向對象的語言,Python文件在通過解釋器解釋後生成字節碼對象PyCodeObject,pyc文件能夠理解爲是PyCodeObject對象的持久化保存方式。數據庫

何時會生成pyc文件呢?

  pyc文件只有在文件被當成模塊導入時纔會生成。也就是說,Python解釋器認爲,只有import進行的模塊才須要被重用。 生成pyc文件的好處顯而易見,當咱們屢次運行程序時,不須要從新對該模塊進行從新的解釋。主文件通常只須要加載一次不會被其餘模塊導入,因此通常主文件不會生成pyc文件。
  下面來舉個例子說明,見代碼緩存

文件print_hello.py

print("hello")
import print_hello

執行python print_hello.py函數

E:\test>python print_hello.py
hello

E:\test>dir
 驅動器 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 字節
               2 個目錄 49,367,699,456 可用字節

能夠發現並無pyc文件生成,
執行python import_hello.py設計

E:\test>python import_hello.py
hello

E:\test>dir
 驅動器 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 字節
               2 個目錄 49,367,699,456 可用字節

須要說明兩點的是:code

  • 執行python import_hello.py,開始執行import print_hello,導入print_hello模塊,而後執行了print_hello模塊裏面的代碼,因此咱們能夠看到有「hello」輸出;
  • 若是不想執行裏面的代碼,通常能夠將代碼封裝在一個類或者函數裏面,而後加個if判斷,相似下面這樣,表示若是是被導入則不執行if下的代碼,若是做爲程序入口或者腳本執行,則執行if下的代碼。
if __name__ == "__main__":
    print("hello")

pyc文件的過時時間

  • 在生成pyc文件的同時,寫入了一個Long型的變量,用於記錄最近修改的時間;
  • 每次載入以前都先檢查一下py文件和pyc文件的最後修改日期,若是不一致則會生成一個新的pyc文件

總結

  總的來講,瞭解pyc其實對於Python開發者來講並無多大的意義,本着鑽研的精神寫下這篇文章,感受有一下幾點能夠考慮對象

  • Python的pyc文件從必定意義上能夠減小解釋器解釋Python文件的時間,沒必要每次都要解釋編譯一遍,方便下次快速加載,有點相似數據庫的緩存吧;
  • 想一想若是咱們想設計一個系統,相似主文件這種不會被重用,而其餘模塊可能會被重用,咱們就須要分開設計對待了吧;
  • 在設計緩存系統時候,相似Python這種對比最後修改時間的方式,是否是能夠給咱們一點啓示呢?
相關文章
相關標籤/搜索