2022年 11月 9日

Python性能测试工具汇总

目录

  • 一、line_profiler
  • 二、memory_profiler
  • 三、timeit
  • 四、pyheat
  • 五、heartrate
  • 六、Pycharm自带的Profiler工具
  • 七、objgraph工具
  • 八、profile和cProfile

一、line_profiler

Python代码优化工具——line_profile

二、memory_profiler

Python代码优化工具——memory_profiler

三、timeit

  1. 参考博客
  2. python内置模块
  3. 功能:测量小代码片段的执行时间
  4. 使用方式:
import timeit
timeit.timeit()
timeit.repeat()
  • 1
  • 2
  • 3

5、参数注解:

  • stmt:传入要测试时间的代码,可以直接接受字符串的表达式,也可以接受函数。如果传入函数,需要把函数导入在当前文件中,调用timeit方法时的参数为 stmt = 'func()', setup = 'from __main__ import func'即可。
  • setup:传入stmt的运行环境,比如stmt中使用到的参数、变量,要导入的模块等。可以写一行语句,也可以写多行语句,写多行语句时要用分号;隔开语句。
  • number:在一组测试中执行stmt的次数,默认100000次。
  • repeat:重复测试的组数,每次的结果构成列表返回,默认5次。
  • 最终执行的次数为number * repeat

6、个人评价

  • 缺点:只能执行小代码片段,使用的场景很受限制
  • 优点:使用方法简单,且因为stmt可以传函数,所以我们可以将部分简单的代码封装在函数里(比如接口响应时间测试),然后开始重复测试。

四、pyheat

  1. github网址
  2. 安装命令:pip3 install py-heat
  3. 功能:代码执行完毕后,会弹出一个热力图片用来展示每行代码的执行时间。
  4. 使用方式:
    – 命令行方式
pyheat <文件名> -
  • 1
  • 代码方式:
    from pyheat import PyHeat
    ph = PyHeat(<目标文件路径>)
    ph.create_heatmap()
    # To view the heatmap.
    ph.show_heatmap()
    # To output the heatmap as a file.
    ph.show_heatmap()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 使用时的一些小细节:
  • 使用命令行方式时,业务代码里出现导自定义包的逻辑时,会报ModuleNotFoundError错,需要使用sys.path.append(<自定义包上层路径>)方法解决,原因是pyheat内部实际上调用pprofile来执行目标路径的代码,实际调用位置与使用pyheat的位置不同。
  • 只会展示最多两个图片:
    • 代码方式执行时:调用pyheat的文件 + pyheat调用的文件
    • 命令行方式执行时:pyheat调用的文件。
  • 个人评价
    • 虽然与matplotlib工具结合,可以以热力图的形式看到每行代码的调用时间,但也仅仅能看到调用时间,而且实际测试时发现结果并不准确,再加上导包问题,个人不推荐使用这个包。

五、heartrate

  1. github网址
  2. 安装命令:pip3 install heartrate
  3. 功能:可以在浏览器上实时查看每一行代码的调用次数,用颜色条的深浅和长度来区分最近调用情况和总体调用情况。
  4. 使用方式:
from heartrate import trace, files
trace(files=files.all, browser=True)
  • 1
  • 2
  1. 使用时的一些小细节:
  • 使用时应该把trace语句放在业务代码之前执行,可以是main方法里,也可以放在from heartrate import trace, files之后执行,因为只有执行了这个语句后才会在浏览器上看到接下来代码的调用情况。
  • 默认跟踪的代码是当前文件,可以在trace里的files参数里指定希望跟踪的文件。具体细节可以参考上方的github介绍。
  • trace里的host参数填充的是什么,打开浏览器时网址就应该填什么,例如代码里host参数填写的localhost,那浏览器上的网址写127.0.0.1就不可以。原因是源码里使用的Flask框架搭建的页面,其SERVER_NAME参数使用的是trace方法里所填hostport,没有做任何映射处理。
  • 运行代码后自动打开浏览器的条件:
    • 不填host参数或者host参数填写localhost127.0.0.1
    • browser参数填True
  • 个人评价
    • 比较好玩,想法与其他性能测试工具相比较为新颖,但只能查看调用次数,对于性能调优来说比较鸡肋。

六、Pycharm自带的Profiler工具

  1. 官方文档
  2. 这个工具只能在专业版使用,使用方法也很简单,就是可以使用Run/Debug运行的代码都可以使用Profiler运行,运行结束后会自动弹出性能检测结果,结果包括调用的方法/类/文件等耗时情况以及各函数调用关系图。这个关系图还是比较有用的。

七、objgraph工具

  1. 参考博客

八、profile和cProfile

  1. cProfile和profile功能相似,区别是profile是纯Python语言实现的,cProfile是C语言实现的。
  2. 官方文档
  3. profile和cProfile通常会和pstats内置模块连用,对分析结果进行更多的过滤操作。