當涉及到Python代碼(或任何代碼)的優化時,它通常會歸結爲優化瓶頸或緩慢功能。但是,在優化這些代碼區域時,是否有任何使用純Python的使用案例字節碼inline?我知道你可以通過使用compile
內置函數和compiler
模塊來完成此操作。通過字節碼對Python進行優化
5
A
回答
5
......有沒有使用純Python字節碼內聯的任何用例?
是的。有時你可以手動處理比Python通常自行生成的代碼更快的代碼。
此外,您可以訪問列表解析的循環歸納變量。
這裏有一些鏈接,讓你開始:https://www.google.com/search?q=python+bytecode+hacks
如果你想使字節碼操作編程,這裏是一個優化配方,顯示瞭如何去做:Decorator for BindingConstants at compile time
也就是說,如果你關心速度,最簡單的加速通常是運行pypy而不是cpython如果你的應用程序允許的話。
4
否。當模塊第一次加載時,源代碼僅編譯爲字節碼一次。字節碼是在運行時解釋的。因此,即使您可以將字節碼內聯到您的源代碼中,它最多也只會通過減少Python花費將源代碼轉換爲字節碼的時間來影響程序的啓動時間。它實際上不會改變代碼的運行速度。例如,運行1000次的循環的「純字節碼」版本運行速度不會超過Python源代碼中寫入的相同循環。見this similar question和this one。
compile
和compiler
的存在讓您可以在程序運行時從字符串動態創建新的可執行源代碼。這不是爲了獲得性能優勢,只是因爲沒有其他方法可以做到這一點。當你運行一個Python程序時,Python將它的源代碼編譯成字節碼。但是,如果您想要動態創建不直接存在於源代碼中的新功能(例如,通過混合和匹配代碼片段,或允許用戶在程序運行時鍵入代碼),則需要一種方法來編譯它們在飛行中,這就是compile
的用途。 (這實際上並不是常見的需求,所以這些功能並不經常使用。)
相關問題
- 1. 優化通過節點
- 2. Java字節碼優化
- 3. 優化Java字節碼?
- 4. 通過Sandy-Bridge CPU進行優化?
- 5. 通過oracle DB進行搜索優化
- 6. 用大數字進行Python優化
- 7. 通過對行進行排序來優化MySQL
- 8. 有多少地方在Python的字節碼(版本2.5)中進行了優化
- 9. 此代碼如何通過GCC進行優化?
- 10. 通過NSData字節進行迭代
- 11. 大字節優化[]
- 12. 可能優化字節碼序列
- 13. Java優化:僅字節碼vs JIT
- 14. 允許Gerrit通過插件或API進行字節碼檢查?
- 15. 如何從C++初始化一個嵌入式Python解釋器並進行字節碼優化?
- 16. 通過CPython執行跟蹤Python字節碼
- 17. Python代碼優化
- 18. 優化python代碼
- 19. 優化Python代碼
- 20. 優化Python代碼
- 21. 如何針對Android平臺進行鍼對性優化代碼?
- 22. 通過優化和不進行優化的模式下的不同結果
- 23. scipy.optimize.minimize在python中進行約束優化
- 24. 優化jQuery代碼,通過$。員額
- 25. 通過刪除循環優化Python代碼
- 26. 熊貓:優化一些python代碼通過擺脫DataFrame.apply()
- 27. r.js需要進行優化通話
- 28. 使用libnvvm進行代碼優化
- 29. Python-代碼優化幫助 - 查找字
- 30. 通過網絡和字節數組對Java對象進行序列化/反序列化
你不會寫Python的* * *字節碼,就像你不會使用內聯彙編程序來編寫C編譯器所要的相同的機器代碼一樣。關鍵是寫出更好的字節碼。 – user2357112
@ user2357112:儘管下面的答案表明可能在理論上是可能的,但是使用'compile'是不可能的,因爲compile只是從一個字符串編譯Python源代碼。如果通過將字符串傳遞給'compile'可以獲得更好的字節碼,只需將該源代碼直接放入程序即可獲得相同的字節碼。 – BrenBarn
確實如此,但他也提到了'編譯器'模塊,它可以用來構建比'compile'通常給出的更復雜的代碼對象。當然,更簡單的方法是直接創建'types.CodeType'對象,如果你喜歡手動編寫python字節碼。 Python vm是一個非常整潔的面向堆棧的野獸。 – Perkins