这篇文章将为大家详细讲解有关Python性能之cProfile和line_profile搭配使用的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

python性能调试过程中最突出的问题就是耗时,性能测试工具有很多,这里介绍cprofile和line_profiler的搭配使用方法。前者返回项目中每个函数的耗时,后者可以分析函数每一行的耗时。

一,cProfile

cProfile是python默认的性能分析器

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

参数分析:

run(statement,filename=None,sort=-1)#statement:需要测试的代码或者函数(函数名)#fielname:结果保存的位置,默认为stdout#sort:结果排序方法,常用的有‘cumtime':累积时间,’name':函数名,‘line':行号#以及下面结果分析里的’ncalls'等

使用方法一:

importreimportcProfilecProfile.run('re.compile("abc")')

结果分析:

第一行:129个函数调用被监控,其中128个是原生调用(不涉及递归)

ncalls:函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。

tottime:函数内部消耗的总时间。(可以帮助优化)

percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。

cumtime:之前所有子函数消费时间的累计和。

filename:lineno(function):被分析函数所在文件名、行号、函数名。

使用方法二:

importcProfileimportrecProfile.run('re.compile("abc")','result.out','cumtime')

使用方法三:控制台

终端:python-mcProfile-oresult.out-scumulativetest.py#效果同方法二

结果分析:

结果保存在文件名为result.out的二进制文件里。

结果读取:pstats模块和Stats类

importpstatsdefview_profile(path):p=pstats.Stats(f"{path}")p.sort_stats("cumulative")#表示结果按照累计时间耗费排序,其它排序同上p.print_stats(3)#输出结果输出结果的前三行,参数还可以是0,1之间的小数,表示输出结果的占比,没有参数表示输出全部结果p.print_callers()#可以显示函数被哪些函数调用p.print_callees()#可以显示哪个函数调用了哪些函数

二,line_profiler

这个性能分析器和cProfile不同,他能帮你一行一行的分析性能。

如果瓶颈问题在某一行中,这样就需要line_profiler解决了。

建议使用kernprof工具

安装

pipinstallline_profiler

使用方法一:kernprof

@profiledeffib(n):#文件名aaa.pya,b=0,1foriinrange(0,n):a,b=b,a+breturnafib(5)

终端:kernprof-l-vaaa.py#-l表示逐行分析-v用于控制台输出,不加-v会把分析结果写入aaa.py.lprof文件

使用方法二:函数调用

fromline_profilerimportLineProfilerdeftest_line(func_name,parameter=None):“”“:param:func_name,str,函数名:param:parameter,函数参数”“”lp=LineProfiler()lp_wrapper=lp(func_name)ifparameterisnotNone:lp_wrapper(parameter)#如果有参数,没参数不用写lp.print_stats()#展示结果

结果分析

Line:文件中的行号。

Hits:性能分析时代码执行的次数。

Time:一段代码执行的总时间,由计数器决定。

Per Hit:执行一段代码平均消耗时间。

% Time:执行一段代码时间消耗比例。

三,搭配使用

先用cProfile确定项目中耗时最多的几个函数,然后用line_profiler分析这几个耗时最多的函数,确定行性能瓶颈。

关于Python性能之cProfile和line_profile搭配使用的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。