天天看點

使用cProfile等工具來提高python的執行速度

本文假定你已經十分熟悉python。

衆所周知,python是一種解釋性的語言,執行速度相比c、c++等語言十分緩慢;是以我們需要在其它地方上下功夫來提高代碼的執行速度。

首先需要對代碼進行分析。

代碼分析

傻乎乎地一遍又一遍地檢查代碼并不會對分析代碼的執行時間有多大幫助,你需要借助一些工具。

先看下面這段程式:

瓶頸在磁盤存取,很顯然易見是不是?我們走着瞧。

調優器(profiler)能夠精确地告訴我們程式在執行時發生了什麼。它能夠自動計時并計數程式中的每一行代碼,進而節省大量時間,是優化代碼的第一選擇。

全代碼分析

所有合格的ide都內建有一個調優器,點一下就可以了;如果是在指令行中進行調用,代碼如下:

結果如下:

結果按總時間排序(-s tottime),靠前的更應該被優化。本例中,random模組中的choice函數花費了總時間的将近1/3,現在你知道瓶頸在哪裡了吧。

迫不及待去做優化了?别急,代碼分析有好幾種方法。

塊分析

你可能已經注意到,之前我們是對整個程式段進行分析的。如果你隻對某一部分代碼感興趣,隻需要在這部分代碼的前後加上下面這兩段代碼即可:

結果與全代碼分析的類似,但是隻包含你感興趣的部分。但是一般來說,你不應該直接使用塊分析,在這之前請務必先做是以全代碼分析。

行分析

pip install

line_profiler

安裝成功後,修改代碼,在每一行你想分析的代碼前增加@profile,如下所示:

最後在指令行中輸入如下代碼:

結果如下所示:

注意,代碼執行的速度變慢了,從11秒上升到了21秒。但是瑕不掩瑜,我們知道了是哪一行拖了整段代碼的後腿。

實時不間斷網頁應用該如何分析代碼?

安裝後通過如下指令運作:profiling your_program.py。不要忘了删除在行分析中使用的裝飾器(@profile)。

使用cProfile等工具來提高python的執行速度

結果是互動式的,你可以使用方向鍵輕松浏覽或者折疊/打開每一行。

如果是需要長時間運作的程式(譬如網頁伺服器),也有響應的分析代碼,指令類似于:profiling

live-profile your_server_program.py。一旦開始運作,你可以在程式運作時與之互動,并觀察程式的性能。

分析方法

優化

想知道你是否在循環中浪費了大量時間?現在我們知道程式在哪些地方花費了大量cpu時間,我們可以針對性的進行優化。

注意

隻有在必要的時候和必要的地方才進行優化,因為優化後的代碼通常比優化前更加難以了解和維護。

簡單而言,優化是拿可維護性換取性能。

numpy

numpy包含有許多強大且速度塊的數學函數,安裝指令為:pip install numpy。

對優化後的代碼進行性能分析,結果如下:

新代碼比之前的版本塊了将近4倍(3.3秒vs11.362秒)!現在輪到寫操作拖後腿了,優化方法是舍棄如下代碼

代之以如下代碼:

新代碼一次寫入整個字元串,而之前是逐個字元寫入。

統計一下整段代碼的時間,如下所示:

總時間從11秒減少到了不到1秒!是不是很棒?

其它優化技巧

記住電腦中的這些參數

其它資源

·       

<a href="https://wiki.python.org/moin/pythonspeed/performancetips">python performance tips</a>

<a href="http://www.numpy.org/">numpy</a>

作者:sylvain josserand。

譯者注:原文提供的代碼在驗證時存在些許問題,可能是版本不一造成的。

文章原标題《profiling and

optimizing your python code》,作者:sylvain josserand,譯者:楊輝,審閱:,附件為原文的pdf。<b> </b>