2013-06-27 56 views
7

(這是一個後續Statistical profiler for PyPy優化PyPy

我跑PyPy下一些Python代碼,並想優化它。

在Python中,我將使用statproflineprofiler來知道哪些確切的線條正在導致放緩並嘗試解決它們。但在PyPy中,這兩種工具並沒有真正報告合理的結果,因爲PyPy可能會優化掉一些行。我也不想使用cProfile,因爲我發現很難提取報告功能的哪一部分是瓶頸。

有沒有人有關於如何進行的一些提示?也許另一個在PyPy下很好地工作的profiler?一般來說,如何優化PyPy的Python代碼?

回答

5

如果你瞭解PyPy架構的工作方式,你就會意識到,試圖找出的代碼各行是不是真的生產。你首先用一個用RPython編寫的Python解釋器開始,然後通過一個跟蹤JIT來生成流圖,然後轉換這些圖來優化RPython解釋器。這意味着由正在被JIT處理的RPython解釋器運行的Python代碼的佈局可能與實際運行的優化的彙編器具有非常不同的結構。此外,請記住,JIT始終在循環或函數上工作,因此逐行統計不太有意義。因此,我認爲cProfile對您來說可能是一個很好的選擇,因爲它會讓您瞭解優化的重點。一旦知道哪些功能是瓶頸,您可以針對那些較慢的功能進行優化,而不是嘗試修復一行Python代碼。

請記住,你這樣做是PyPy比CPython的不同性能特點。總是儘量以儘可能簡單的方式編寫代碼(這並不意味着儘可能少的行數)。還有其他一些啓發式方法可以幫助您,例如使用專用列表,當您使用少量大多數恆定鍵時,使用對象覆蓋字典,避免使用C Python API的C擴展等。

如果您真的,真的堅持試圖在生產線一級進行優化。有幾個選項。一個叫做JitViewer(https://bitbucket.org/pypy/jitviewer),它可以讓你對JIT在你的代碼中做什麼有非常低的認識。例如,你甚至可以看到與Python循環對應的彙編指令。使用該工具,您可以真正瞭解PyPy將如何快速處理代碼的某些部分,因爲您現在可以做一些愚蠢的事情,如計算用於循環的彙編程序指令的數量等。

+0

你的建議是什麼? –

+1

我的建議是隻使用cProfile,因爲PyPy的實際工作方式。我的第二個建議是使用JitViewer,如果你真的需要對代碼的性能特徵有一個低級的理解。 – jlund3

+1

在編譯和優化實現解釋器本身的RPython代碼時,應用流程圖轉換*,而不是*您的Python代碼。這些轉換相當於C編譯器應用於CPython解釋器的C代碼的轉換,並且與最終用戶的Python代碼無關。 PyPy的JIT的確提出了你所討論的問題,熱循環可能會被JIT編譯爲多個不同的彙編代碼塊,這使得將性能映射回單個Python語句變得非常棘手。 – Ben