如何進行python性能分析?

在分析python代碼性能瓶頸,但又不想修改源代碼的時候,ipython shell以及第三方庫提供了不少擴展工具,能夠不用在代碼裏面加上統計性能的裝飾器,也能很方便直觀的分析代碼性能。下面以我本身實現的一個快排代碼爲例,帶你使用集中不一樣的性能分析工具。python

def quick_sort(data, low, high):
    if low >= high:
        return
    
    left, right = low, high
    key = data[left]
    while left < right:
        while left < right and data[right] >= key:
            right -= 1
        data[left] = data[right]
        while left < right and data[left] <= key:
            left += 1
        data[right] = data[left]
    
    data[right] = key
    quick_sort(data, low, left - 1)
    quick_sort(data, left + 1, high)
    
import random
data = [random.randint(0, 1000) for _ in xrange(500)]

time

在ipython shell中,經過輸入命令%time quick_sort(data, 0, 499)就能夠查看調用耗時。算法

其中time命令的輸出wall time是實際耗時的意思,經過簡單的耗時查看就能夠得出此快排算法針對不均勻分佈的數組要慢不少。shell

timeit

在ipython shell中,經過輸入命令%timeit -n 100 -r 5 quick_sort(data, 0, 499),就能夠很方便的實現屢次調用找到最短耗時。centos

此命令的含義就是重複100遍,每遍調用5此quick_sort,timeit會返回每遍的最短平均耗時。數組

line_profiler

line_profiler能夠分析函數內每一行的執行時間,能夠很方便的找出性能瓶頸。line_profiler不是ipython自帶工具,須要經過pip install line_profiler安裝。在ipython交互界面,經過下面方式使用:bash

首先須要經過%load_ext導入line_profiler, -f參數是須要分析的函數。lprun命令的參數能夠經過%lprun?查看。多線程

profile

profile和cProfile是python內置的性能分析工具。能夠經過很簡單的命令分析每一個函數的執行時間。app

圖中的命令按照累計執行時間進行降序排列,能夠較爲方便的找出最爲耗時的函數。若是想更爲直觀的展現,還能夠安裝可視化組件gprof2dot和graphviz,安裝方法以下:dom

pip install gprof2dot
brew install graphviz (for mac)
yum -y install graphviz (for centos)

安裝好以後再ipython shell連執行cProfile.run('quick_sort(data, 0, 499)', filename='result.out', sort='cumulative')命令將耗時分析結果導出只result.out文件中,而後在bash shell裏執行命令gprof2dot -f pstats result.out | dot -Tpng -o result.png便可生成很是直觀的調用耗時圖。函數

固然用到的這個例子不是很好,沒有把圖像的優點展示出來,在調用很是複雜的時候,自上而下,函數的調用關係和耗時狀況一目瞭然。更多的使用能夠查閱python官方文檔。

yappi

和profile、cProfile相似,可是yappi對於多線程有着更好的支持,profile不會區分多線程,因此結果看起來會很亂。yappi文檔鏈接:https://bitbucket.org/sumerc/yappi/wiki/ApiYappi

使用方法以下:

import yappi
yappi.clear_stats()
yappi.start()
quick_sort(data, 0, 499)
yappi.stop()
stats = yappi.convert2pstats(yappi.get_func_stats())
stats.sort_stats("cumulative")
stats.print_stats()

在python shell連執行這些就能夠把要分析的函數按照累計執行時間排序後打印出來,固然yappi一樣能夠用圖像表示,在python shell裏執行stats.dump_stats('result.out')把耗時數據導出到result.out中,而後在bash shell裏面執行gprof2dot -f pstats result.out | dot -Tpng -o result.png,生成圖像以下:

固然yappi.start中還能夠添加一些參數是否分析多線程以及builtin函數。

相關文章
相關標籤/搜索