首页 > 代码库 > Python程序性能分析实例

Python程序性能分析实例

在进行代码评审时,得知资源处理程序运行时间很长,遂考虑对其进行性能分析

资源处理程序分为,读取处理、排序、输出三部分,在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程序性能分析实例