2014-01-06 55 views
5

當涉及到Python代碼(或任何代碼)的優化時,它通常會歸結爲優化瓶頸或緩慢功能。但是,在優化這些代碼區域時,是否有任何使用純Python的使用案例字節碼inline?我知道你可以通過使用compile內置函數和compiler模塊來完成此操作。通過字節碼對Python進行優化

回答

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 questionthis one

compilecompiler的存在讓您可以在程序運行時從字符串動態創建新的可執行源代碼。這不是爲了獲得性能優勢,只是因爲沒有其他方法可以做到這一點。當你運行一個Python程序時,Python將它的源代碼編譯成字節碼。但是,如果您想要動態創建不直接存在於源代碼中的新功能(例如,通過混合和匹配代碼片段,或允許用戶在程序運行時鍵入代碼),則需要一種方法來編譯它們在飛行中,這就是compile的用途。 (這實際上並不是常見的需求,所以這些功能並不經常使用。)

+2

你不會寫Python的* * *字節碼,就像你不會使用內聯彙編程序來編寫C編譯器所要的相同的機器代碼一樣。關鍵是寫出更好的字節碼。 – user2357112

+0

@ user2357112:儘管下面的答案表明可能在理論上是可能的,但是使用'compile'是不可能的,因爲compile只是從一個字符串編譯Python源代碼。如果通過將字符串傳遞給'compile'可以獲得更好的字節碼,只需將該源代碼直接放入程序即可獲得相同的字節碼。 – BrenBarn

+0

確實如此,但他也提到了'編譯器'模塊,它可以用來構建比'compile'通常給出的更復雜的代碼對象。當然,更簡單的方法是直接創建'types.CodeType'對象,如果你喜歡手動編寫python字節碼。 Python vm是一個非常整潔的面向堆棧的野獸。 – Perkins