Python程序在解釋器上執行分兩個過程:python
編譯:若是Python進程在機器上擁有寫入權限,那麼它會把程序的字節碼保存爲一個以 .pyc 爲擴展名的文件。當程序運行後,會在源代碼的同一個目錄下看到 .pyc結尾的文件。Python這樣保存字節碼是做爲一種啓動速度的優化。下一次運行程序時,若是在上次保存字節碼以後沒有修改過源碼的話,Python將會直接加載 .pyc 文件並跳過編譯這個步驟。當Python必須從新編譯時,它會自動檢查源文件和字節碼文件的時間戳:若是在上次保存過的源代碼基礎上進行了修改,下次程序運行時,字節碼將自動從新建立。優化
執行:當程序編譯成字節碼以後,字節碼會被髮送到一般稱爲Python虛擬機(Python Virtual Machine,簡寫爲PVM)上執行。它不是一個獨立的程序,不須要安裝。PVM是Python的運行引擎,它時常表現爲Python系統的一部分,而且是實際運行腳本的組件。從技術上來說,它纔是Python解釋器的最後一步。(事實上,PVM就是迭代運行字節碼指令的一個大循環,一個接一個的完成操做)。 spa
ps:Python字節碼不是機器的二進制碼。字節碼是特定於Python的一種表現形式。這就是Python代碼沒法運行得像C或C++代碼同樣快的緣由。PVM循環仍然須要解釋字節碼。而且字節碼指令與CPU指令相比須要更多的工做。翻譯
執行過程:進程
當python程序運行時,編譯的結果是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。內存
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。編譯器
PyCodeObject是Python編譯器真正編譯成的結果;pyc文件實際上是PyCodeObject的一種持久化保存方式。源碼
pyc的目的是重用:編譯型語言的優勢在於,能夠在程序運行時不用解釋,而直接利用已經「翻譯」過的文件。也就是說,之因此要把py文件編譯成pyc文件,是在於咱們運行程序時,再也不須要對該模塊進行從新的編譯。虛擬機