进行分析的辅助类
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行结果
打印数据的解读:
--第一行表示运行这个函数一共使用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