在进行代码评审时,得知资源处理程序运行时间很长,遂考虑对其进行性能分析
资源处理程序分为,读取处理、排序、输出三部分,在300万数量级的输入时,大约需要50分钟。对三部分分别计时,先使用10万输入数据进行测试,运行总时间为75秒,其中读取处理耗时65秒。
接下来计划对读取处理过程中的每一行代码进行时间统计,调研有无相关工具可以帮助进行性能分析。终于在http://blog.jobbole.com/47619/中找到合适的工具,line_profiler。
1、工具安装:
使用pip install line_profile进行安装,line_profile基于IPython运行,在本地服务器安装后发现,依赖没有能够成功安装,所以再使用pip安装以下包:
enum34backports.shutil_get_terminal_sizepathlib2scandir之后运行通过,完成安装
2、运行:
首先在需要统计的函数上添加@profile装饰器,即可在之后对该函数中的每一行代码进行统计。在主函数上增加该装饰器,并通过命令行
kernprof -l -v cleanData.py 运行程序
运行后的输出类似于如下:
Timer unit: 1e-06 s File: primes.py Function: primes at line 2 Total time: 0.00019 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 2 @profile 3 def primes(n): 4 1 2 2.0 1.1 if n==2: 5 return [2] 6 1 1 1.0 0.5 elif n<2: 7 return [] 8 1 4 4.0 2.1 s=range(3,n+1,2) 9 1 10 10.0 5.3 mroot = n ** 0.5 10 1 2 2.0 1.1 half=(n+1)/2-1 11 1 1 1.0 0.5 i=0 12 1 1 1.0 0.5 m=3 13 5 7 1.4 3.7 while m <= mroot: 14 4 4 1.0 2.1 if s[i]: 15 3 4 1.3 2.1 j=(m*m-3)/2 16 3 4 1.3 2.1 s[j]=0 17 31 31 1.0 16.3 while j<half: 18 28 28 1.0 14.7 s[j]=0 19 28 29 1.0 15.3 j+=m 20 4 4 1.0 2.1 i=i+1 21 4 4 1.0 2.1 m=2*i+3 22 50 54 1.1 28.4 return [2]+[x for x in s if x] 即可在输出中,看到每一行运行次数,耗时,平均耗时,时间占比数据 时间信息都是以微秒为单位 经过查看输出结果,看以看到oProc.process(text)一句耗时占比为63%应该为需要优化的主要部分。 继续在该函数上添加@profile并进行统计,发现主要耗时在文本的全角转半角,繁体转简体,去除无效符号部分。 3、结论 得到性能瓶颈后,发现程序主要耗时在文本处理部分,之后打算使用c++重写该部分逻辑以优化整体性能。转载于:https://www.cnblogs.com/ruizhang3/p/6391839.html
相关资源:Python性能分析工具Profile使用实例