在CPython中,我認爲導入意味着將py文件編譯爲pyc文件並在當前幀中執行該文件,並且下一次CPython將直接加載pyc文件而無需再次編譯。進口鐵thon What怎麼辦?我猜Ironpython沒有類似pyc的格式。每次導入時都會編譯它嗎?在Ironpython中導入模塊時會發生什麼?
6
A
回答
7
是的,IronPython在每次運行時重新編譯導入的模塊。其實,兩次。
這很複雜。
第一遍,Python代碼被解析成AST,AST被轉換成DLR表達式樹,表達式樹被存儲。當它是執行它的時候,表達式樹被編譯成一組簡單的基於棧的解釋器的指令,並且模塊代碼在該解釋器上執行。運行時速度並不快,但啓動時間很少。
一段代碼運行了一段時間後,IronPython厭倦了它的速度,返回表達式樹並將代碼重新編譯爲.NET委託。這意味着它將被轉換爲MSIL,然後由.NET JIT轉換爲本機代碼。此代碼執行起來很快,但需要時間來創建。
這個轉換是按照函數(或者甚至每個循環)完成的,所以如果你重複使用一個模塊中的一個函數而其餘的函數都沒有,那麼只有一個常用函數會接受完整的IL代碼生成和JITting。
但是,沒有將此編譯保存到磁盤。 IronPython附帶的pyc.py程序可以預編譯代碼,但不會自動完成,因爲運行時生成的代碼與pyc.py生成的代碼不同。運行時代碼通常是可收集的,而由pyc.py生成的代碼不是 - 並且在運行時生成不可收集的代碼會導致內存泄漏。通過保存幾個步驟,pyc.py應該使導入速度更快,但我不知道多少。
+0
非常感謝! – zchenah
相關問題
- 1. 在Python中導入模塊時會發生什麼?
- 2. IronPython,導入模塊
- 3. IronPython導入模塊
- 4. IronPython有時會導入模塊,但不會導入其他模塊
- 5. IronPython子模塊導入
- 6. 如何在IronPython中導入.PYD模塊?
- 7. 模塊導入時真的發生了什麼?
- 8. 當模塊初始化發生異常時會發生什麼
- 9. 當我在Python中導入模塊兩次時發生了什麼
- 10. Firefox擴展javascript模塊:未導出符號會發生什麼?
- 11. IronPython託管緩存導入模塊?
- 12. 的IronPython無法導入模塊 「OS」
- 13. IronPython無法導入模塊os
- 14. IronPython無法導入模塊cv2(OpenCV)
- 15. 當GIT子模塊「脫機」時會發生什麼?
- 16. 當我們重新加載Elixir模塊時會發生什麼?
- 17. swf嵌入時會發生什麼?
- 18. 導入模塊時會導出{foo as bar}會有什麼影響
- 19. 爲什麼導入python模塊不導入嵌套模塊?
- 20. 在SL中託管IronPython時導入第三方模塊時遇到問題
- 21. 發生故障時會發生什麼?
- 22. 什麼時候會發生?
- 23. 關於angular 2當我從大型庫中只導入一個模塊時會發生什麼?
- 24. 在Python中,當你在函數內部導入時會發生什麼?
- 25. 有什麼區別:導入模塊和從模塊導入模塊?
- 26. 如何在發生錯誤時取消導入模塊?
- 27. 當您在Javascript中使用someModule導入someModuleName時會發生什麼情況
- 28. python會在多次導入模塊時優化模塊嗎?
- 29. 當您不在Flash中嵌入字體時會發生什麼?
- 30. 當你在瀏覽器中輸入URL時會發生什麼
還是沒人回答?看來我必須自己回答... – zchenah