• 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 GUI编程(Tkinter)——Label and Button
    第一章——正则表达式(特殊符号和字符)
    最近用到的Blender相关技术总结
    第一章—正则表达式(简介/动机)
    发个随笔纪念Manim配置成功
    JUC并发工具的使用和原理
    线程启动与终止原理
    cpu缓存一致性
    布隆过滤器
    对象并不一定都是在堆上分配内存(逃逸分析)
  • 原文地址:https://www.cnblogs.com/ruizhang3/p/6391839.html
Copyright © 2020-2023  润新知