如何进行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函数。

相关文章
相关标签/搜索