Python通过装饰器并使用cprofile对函数进行性能分析

进行分析的辅助类

Python中提供了很多接口方便我们能够灵活进行性能分析,包括cProfile模块中的Profile类和pstat模块中的Stats类。

cprofile简介

--cprofile是一种确定性分析器,只测量CPU时间,并不关心内存的消耗情况和其他与内存相关联的信息

--它是基于Isprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序

Profile类:

--enable(): 开始进行性能分析并收集数据

--disableI(): 停止性能分析

--create_stats(): 停止收集数据,并为已经收集的数据创建stats对象

--print_stats():创建stats对象并打印分析结果

--dump_stats(filename): 把当前性能分析的内容写入文件filename中

--runcall(func, *args, **kwargs): 收集被调用函数func的性能分析信息

pstats简介

--用来分析cProfile输出的文件内容

--pstas模块为开发者提供了Stats类,可以读取和操作stats文件

Stats类:

(Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源。)

--strip_dirs(): 删除报告中所有函数文件名的路径信息

--dump_stats(filename): 把stats中的分析数据写入文件(也可以写成cProfile.Profile.dump_stats())

--sort_stats(*keys): 对报告列表进行排序,函数会一次按照传入的参数排序

--reverse_order(): 逆反当前的排序

--print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行结果

进行排序的key值

打印数据的解读:

这是得到的一个结果

--第一行表示运行这个函数一共使用0.043秒,执行了845次函数调用

--第二行表示结果是按什么顺序排列的(这里表示按照调用次数来进行排列的)

--ncalls: 表示函数调用的次数(有两个数值表示有递归调用,总调用次数/原生调用次数)

--tottime: 函数内部调用时间(不包括他自己调用的其他函数时间)

    eg:funA(): 

                funB() 得到tottime = funA()执行的时间-funB()执行的时间

--percall: tottime/ncalls

--cumtime: 表示累计调用时间(函数执行玩的总时间),它包含了函数自己内部调用的函数时间

--filename:lineno(function): 函数所在的文件,行号,函数名称

一个例子,使用装饰器对一个函数进行分析

import cProfile

import pstats

import functools

def do_cProfile(do=False, order='tottime'):

        def wrapper(func):

                @functools.wraps(func)

                def profiled_func(*args, **kwargs):

                if do:

                    profile = cProfile.Profile()

                    profile.enable()

                    result = func(*args, **kwargs)

                    profile.disable()

                    #profile.print_stats()

                    ps = pstats.Stats(profile).sort_stats(order).strip_dirs()

                    ps.print_stats()

                else:

                result = func(*args, **kwargs)

                return result

        return profiled_func

return wrapper

上面的函数do_cProfile(do=False, order='tottime')是一个带参数的装饰器,通过do的值来进行性能分析的开关控制,通过order的值来选择输出结果按照什么方式进行排序。

比如我们对函数A和函数B进行性能分析

from profile_decorator import do_cProfile

@do_cProfile(True)

def funA():...

@do_cProfile(True, calls)

def funB():...

如果不给装饰器传入参数的话就是默认的False和tottime

参考连接:

https://zhuanlan.zhihu.com/p/24495603

https://blog.csdn.net/weixin_40304570/article/details/79459811

你可能感兴趣的:(Python通过装饰器并使用cprofile对函数进行性能分析)