性能分析
对代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,cProfile 与 hotshot 等。其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python 标准模块提供三种 profilers:cProfile,profile 以及 hotshot。
cprofile 的使用非常简单,只需要在使用之前进行 import 即可。具体实例如下:
import cProfile
def CountLetters(file_name,n,stopName,verbName):
//内容不足为外人道也 哈哈可以自己随便写
cProfile.run("CountLetters('../gone_with_the_wind.txt',10, None, None)")
程序的运行结果如下:
图 1. 性能分析结果
上图有个字打错啦 调用不是待用
参数官方解释:
其中输出每列的具体解释如下:
●ncalls:表示函数调用的次数;
●tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
●percall:(第一个 percall)等于 tottime/ncalls;
●cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;
●percall:(第二个 percall)即函数运行一次的平均时间,等于 cumtime/ncalls;
●filename:lineno(function):每个函数调用的具体信息;
如果需要将输出以日志的形式保存,只需要在调用的时候加入另外一个参数。如
profile.run("CountLetters('../gone_with_the_wind.txt',10, None, None)","testprof")
接着说
代码覆盖率测试
coverage.py是一个用来统计python程序代码覆盖率的工具。它使用起来非常简单,并且支持最终生成界面友好的html报告。在最新版本中,还提供了分支覆盖的功能。
通过pip安装
pip install coverage
Coverage Command Line
命令行使用说明: 详见:http://nedbatchelder.com/code/coverage/cmd.html
最关键核心的几个参数使用如下:
1. run
执行代码覆盖率统计,只需要通过coverage的run参数执行被统计代码即可。
$ coverage run Count.py arg1 arg2
跑完后,会自动生成一个覆盖率统计结果文件(data file):.coverage。arg1,arg2是啥可以自己查那个链接,因为我还没看。
2. report
有了覆盖率统计结果文件,只需要再运行report参数,就可以在命令里看到统计的结果。
$ coverage report
Name Stmts Miss Cover
------------------------------
Count.py 260 212 18%
3. html
最帅最酷的功能了,直接生成html的测试报告。
$ coverage html -d covhtml
生成的报告非常酷,直接关联代码,高亮显示覆盖和未覆盖的代码,支持排序。可以在这个地址预览一下:
file:///F:/ASE/project28_10/basic/covhtml/index.html
file:///F:/ASE/project28_10/basic/covhtml/Count_py.html
效果如下:
算了不放图啦 自己点开链接
发现链接点不开,还是放图吧
其中红色的就是未覆盖的。
也可以直接点击下图中的
注:coverage run test.py命令运行的文件,会统计项目中包括测试文件本身在内的所有文件,run参数的子参数—source可以指定要统计的文件:$ coverage run --source=totest.py test.py 可以只统计totest.py文件。