标签:function 去除 min 读取 单位 函数 can 使用 range
在进行代码评审时,得知资源处理程序运行时间很长,遂考虑对其进行性能分析
资源处理程序分为,读取处理、排序、输出三部分,在300万数量级的输入时,大约需要50分钟。对三部分分别计时,先使用10万输入数据进行测试,运行总时间为75秒,其中读取处理耗时65秒。
接下来计划对读取处理过程中的每一行代码进行时间统计,调研有无相关工具可以帮助进行性能分析。终于在http://blog.jobbole.com/47619/中找到合适的工具,line_profiler。
1、工具安装:
使用pip install line_profile进行安装,line_profile基于IPython运行,在本地服务器安装后发现,依赖没有能够成功安装,所以再使用pip安装以下包:
enum34
backports.shutil_get_terminal_size
pathlib2
scandir
之后运行通过,完成安装
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++重写该部分逻辑以优化整体性能。
Python程序性能分析实例
标签:function 去除 min 读取 单位 函数 can 使用 range
原文地址:http://www.cnblogs.com/ruizhang3/p/6391839.html