2011-12-08 51 views
6

在CPython中,我認爲導入意味着將py文件編譯爲pyc文件並在當前幀中執行該文件,並且下一次CPython將直接加載pyc文件而無需再次編譯。進口鐵thon What怎麼辦?我猜Ironpython沒有類似pyc的格式。每次導入時都會編譯它嗎?在Ironpython中導入模塊時會發生什麼?

+0

還是沒人回答?看來我必須自己回答... – zchenah

回答

7

是的,IronPython在每次運行時重新編譯導入的模塊。其實,兩次。

這很複雜。

第一遍,Python代碼被解析成AST,AST被轉換成DLR表達式樹,表達式樹被存儲。當它是執行它的時候,表達式樹被編譯成一組簡單的基於棧的解釋器的指令,並且模塊代碼在該解釋器上執行。運行時速度並不快,但啓動時間很少。

一段代碼運行了一段時間後,IronPython厭倦了它的速度,返回表達式樹並將代碼重新編譯爲.NET委託。這意味着它將被轉換爲MSIL,然後由.NET JIT轉換爲本機代碼。此代碼執行起來很快,但需要時間來創建。

這個轉換是按照函數(或者甚至每個循環)完成的,所以如果你重複使用一個模塊中的一個函數而其餘的函數都沒有,那麼只有一個常用函數會接受完整的IL代碼生成和JITting。

但是,沒有將此編譯保存到磁盤。 IronPython附帶的pyc.py程序可以預編譯代碼,但不會自動完成,因爲運行時生成的代碼與pyc.py生成的代碼不同。運行時代碼通常是可收集的,而由pyc.py生成的代碼不是 - 並且在運行時生成不可收集的代碼會導致內存泄漏。通過保存幾個步驟,pyc.py應該使導入速度更快,但我不知道多少。

+0

非常感謝! – zchenah

相關問題