重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章将为大家详细讲解有关Python性能之cProfile和line_profile搭配使用的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
10余年的扎兰屯网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整扎兰屯建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“扎兰屯网站设计”,“扎兰屯网站推广”以来,每个客户项目都认真落实执行。
python性能调试过程中最突出的问题就是耗时,性能测试工具有很多,这里介绍cprofile和line_profiler的搭配使用方法。前者返回项目中每个函数的耗时,后者可以分析函数每一行的耗时。
一,cProfile
cProfile是python默认的性能分析器
cProfile是一种确定性分析器,只测量CPU时间,并不关心内存消耗和其他与内存相关联的信息。
参数分析:
run(statement, filename=None, sort=-1) # statement: 需要测试的代码或者函数(函数名) # fielname: 结果保存的位置, 默认为stdout # sort: 结果排序方法,常用的有‘cumtime': 累积时间, ’name': 函数名, ‘line': 行号 # 以及下面结果分析里的’ncalls'等
使用方法一:
import re import cProfile cProfile.run('re.compile("abc")')
结果分析:
第一行:129个函数调用被监控,其中128个是原生调用(不涉及递归)
ncalls:函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。
tottime:函数内部消耗的总时间。(可以帮助优化)
percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。
cumtime:之前所有子函数消费时间的累计和。
filename:lineno(function):被分析函数所在文件名、行号、函数名。
使用方法二:
import cProfile import re cProfile.run('re.compile("abc")', 'result.out', 'cumtime')
使用方法三:控制台
终端:python -m cProfile -o result.out -s cumulative test.py # 效果同方法二
结果分析:
结果保存在文件名为result.out的二进制文件里。
结果读取:pstats模块和Stats类
import pstats def view_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工具
安装
pip install line_profiler
使用方法一:kernprof
@profile def fib(n): # 文件名aaa.py a, b = 0, 1 for i in range(0, n): a, b = b, a+b return a fib(5)
终端:kernprof -l -v aaa.py # -l表示逐行分析 -v用于控制台输出, 不加-v会把分析结果写入aaa.py.lprof文件
使用方法二:函数调用
from line_profiler import LineProfiler def test_line(func_name, parameter=None): “”“ :param: func_name, str, 函数名 :param: parameter, 函数参数 ”“” lp = LineProfiler() lp_wrapper = lp(func_name) if parameter is not None: lp_wrapper(parameter) #如果有参数,没参数不用写 lp.print_stats() # 展示结果
结果分析
Line:文件中的行号。
Hits:性能分析时代码执行的次数。
Time:一段代码执行的总时间,由计数器决定。
Per Hit:执行一段代码平均消耗时间。
% Time:执行一段代码时间消耗比例。
三,搭配使用
先用cProfile确定项目中耗时最多的几个函数,然后用line_profiler分析这几个耗时最多的函数,确定行性能瓶颈。
关于Python性能之cProfile和line_profile搭配使用的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。