对代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位。本文主要讨论如何在项目中测试Python瓶颈函数,对于模块化程度比较好的项目运用如下方法测试会得到比较好的效果.

测试的方法大致如下:利用profile对每个 python 模块进行测试(具体显示可以采用文本报表或者图形化显示),找到热点性能瓶颈函数之后,再利用 line_profiler 进行逐行测试,寻找具有高 Hits 值或高 Time 值的行,最后把需要优化的行语句通过例如Cython之类的优化工具进行优化

   

(1)利用profile分析相关的独立模块

  利用profile分析相关的独立模块,python内置了丰富的性能分析工具,profile,cProfile与hotshot等。其中Profiler是python自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python标准模块提供三profilers:cProfile,profile以及hotshot。profile是python的标准库。可以统计程序里每一个函数的运行时间,并且提供了多样化的报表。使用profile来分析一个程序很简单,profile可以直接用python解释器调用profile模块来剖分py程序,如在命令行界面输入如下命令:

python -m cProfile profileTest3.py

输出的形式如下所示:

其中输出每列的具体解释如下:

●ncalls:表示函数调用的次数;

●tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;

●percall:(第一个percall)等于tottime/ncalls;

●cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;

●percall:(第二个percall)即函数运行一次的平均时间,等于cumtime/ncalls;

●filename:lineno(function):每个函数调用的具体信息

   三者对比:profile速度很慢,只能用于一些小的脚本测试,测试大一点的benchmark往往需要十几分钟甚至更多时间。hotshot和cProfile是用C实现的,所以速度比较快。hotshot有一个缺点是它不支持多线程编程,而且在python2.5以后已经不再维护,较新的版本已经不支持。cProfile相比其它两者有速度快而且能够适用所以版本

(2)通过pstats进行文本报表分析 或者 使用gprof2dot进行报表图形树分析

直接使用profile展示出出来的结果很不明朗,需要自己去慢慢找那些模块占用的时间比较多,我们可以先

把这个文件编译成为中间结果,使用命令python -m cProfile -o funb.prof profileTest3.py

然后可以通过pstats模块进行文本报表分析,它支持多种形式的报表输出,是文本界面下一个较为实用的工具。pstats模块里的有两个有用的函数sort_stats()和t_stats()接受一个或者多个字符串参数,如”time”、”name”等,表明要根据哪一列来排序,这相当有用,例如我们可以通过用time为key来排序得知最消耗时间的函数,也可以通过cumtime来排序,获知总消耗时间最多的函数。另一个相当重要的函数就是print_stats——用以根据最后一次调用sort_stats之后得到的报表。print_stats有多个可选参数,用以筛选输出的数据;

利用这些函数编写一个文本报表分析的脚本如下(这个脚本的含义就是对刚刚的中间结果进行分析,输出函数运行总时间最大的前十个函数)

运行这个脚本:

这些运行结果明朗很多,前面几个函数就是热点瓶颈函数

  对于C/C++项目可以利用 gprof2dot 和 graphviz 图形化定位 linux c/c++系统性能瓶颈,对于 python 也是如此。gprof2dot.py 脚本是一个广泛应用的性能测试工具,它既可以和 gprof 结合测 C/C++程序的热点函数,也能和 cProfile 结合测试 Python 项目。文本格式的报告,对于小规模的程序已经足够了,但是对于大规模的程序来说,就显得还是太繁杂了,特别是我们把注意力放在调用关系上时,文本的跳跃总是让人不舒服,gprof2dot.py 程序用于将性能分析结果转化为 dot 文件。dot 是一种编写绘图脚本的语言,它属于 graphviz 软件,它可以很直观的显示运行时的程序流程图,然后很直观的看出每个步骤的占用时间百分比,函数调用次数,颜色能直观的表示出瓶颈所在。使用它需要下载安装 graphviz 软件包,下载 gprof2dot.py 文件,把它的安装路径放入环境变量中。

使用 cProfile 结合gprof2dot.py 脚本方法如下:

测试pybench中的List.py   输入命令
python -m cProfile -o output.pstats profileTest3.py
python gprof2dot.py -f pstats output.pstats | dot -Tpng -o profiling_results.png
执行成功后会将性能分析结果保存在.png 文件中

打开png文件将显示出来报表树

局部图

每个节点的说明如下:
+----------------------------------+
|
function name : module name
|
| total time including sub-calls % | total time including sub-calls %
|
(self execution time %)
|------------------------------------>
| total number of self calls
|
+----------------------------------+
显示的程序执行过程完全对应,清晰明了,每个方框内部显示函数名称,函数整体包括内部子函数占用时间%比,函数自身,不包括内部子函数占用时间%比,函数执行次数。边表示父函数调用该子函数占用的时间%比,调用次数。之所以清晰是因为,gprof2dot默认是部分函数调用图,对性能影响不大的函数调用都不显示。而且函数的所占用时间决定了它的颜色,用红色,绿色标注的都是热点函数,其次是蓝色

(3)通过line_profiler对热点函数进行逐行分析

在检测出来耗时比较大的瓶颈函数后,需要进一步细化测试在一个瓶颈函数中哪些语句调用次数最多耗时最大。这

些语句是可以通过优化带来最大改善的地方。测试的方法是使用一个 line_profiler 的项目来查看脚步中每行代码多快

多频繁的被执行。

使用方法具体介绍如下:

首先通过 pip 安装该 python 包 $ pip install line_profiler

一旦安装完成,你将会使用一个称做“line_profiler”的新模组和一个“kernprof.py”可执行脚本。想要使用该工具,首先修改

你的源代码,在想要测量的函数上装饰@profile 装饰器。不要担心,你不需要导入任何模组。kernprof.py 脚本将会在执

]行的时候将它自动地注入到你的脚步的运行时。

测试过程需要在要测试的脚本文件第一行设置好@profile 装饰器,然后使用 kernprof.py

执行你的脚本

执行命令 python kernprof.py -l -v primes.py

输出结果如下图:

分析输出结果寻找具有高 Hits 值或高 Time 值的行。这些就是可以通过优化带来最大改善的地方。这个脚本的第

8行,第 16,17,18 行是需要进行改进优化的地方

综上所述,对于 python 项目进行性能测试的方法,可以应用测试benchmark 的方法对于项目中每个 python 模块进

行测试(具体显示可以采用文本报表或者图形化显示),找到热点性能瓶颈函数之后,再利用 line_profiler 进行逐行测

试,寻找具有高 Hits 值或高 Time 值的行,最后把需要优化的行语句通过例如Cython之类的优化工具进行优化即可

Python性能测试方法相关推荐

  1. python性能测试方法_Python实现测试磁盘性能的方法

    本文实例讲述了Python实现测试磁盘性能的方法.分享给大家供大家参考.具体如下: 该代码做了如下工作: create 300000 files (512B to 1536B) with data f ...

  2. python性能测试方法_Python性能测试之performance

    01使用 Python 性能测试套件 正如之前我在 speed.python.org 网站提到的,Python 核心开发团队非常重视性能问题,这对于比较官方基准和 CPython 版本非常有用. 如图 ...

  3. 如何测试sql服务器的性能测试,SQL执行效率和性能测试方法

    对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提高执行效率和整体运行性能.如何选择SQL语句,本文提供了两种方法,分别对多条SQL进行量化 ...

  4. 性能压测服务器502报错,一种交易系统的性能测试方法及相关服务器

    1. 一种交易系统的性能测试方法,其特征在于,包括: 性能测试服务器发送N条性能测试交易至应用服务器,其中N>0; 所述性能测试服务器接收所述应用服务器发送的监测报告,所述监测报告为所述应用 服 ...

  5. rust python扩展_Rust语言优化Python性能案例

    原标题:Rust语言优化Python性能案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关键模块上用另外一门语言 Rust ...

  6. php和python对比-PHP和Python性能比较:放弃PHP改用Python

    PHP和Python性能比较:放弃PHP改用Python 来源:程序员人生 发布时间:2014-05-27 16:31:25 阅读次数:1367次 本文作者作为一名从事PHP开发11年的资深开发者,却 ...

  7. python3 性能提升_整理下Python性能语法,非常有效的提高性能的tips

    阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言. ...

  8. Python 性能剖分工具

    Python 性能剖分工具 眼看着项目即将完成,却被测试人员告知没有通过性能测试,这种情况在开发中屡见不鲜.接下来的工作就是加班加点地找出性能瓶颈,然后进行优化,再进行性能测试,如此这般周而复始直到通 ...

  9. 【Python】这10个Python性能调优的小技巧,你知道几个?

    这篇文章关于Python性能调优的10个小技巧,每天花5-10分钟阅读我的文章,对你技术提升一定会有帮助. 1 多多使用列表生成式 替换下面代码: cube_numbers = []for n in ...

最新文章

  1. 【spring】p命名空间的使用
  2. php7 java8_php7 vs java8 vs nodejs5 vs lua5.2 计算性能比较
  3. TIOBE 1 月编程语言:Python 摘得 2020 年度编程语言!
  4. 高并发下缓存与数据库双写不一致解决方案
  5. php mysql 分类_php+mysql实现无限分类实例详解
  6. silverlight元素FrameworkElement.LayoutUpdated布局变化事件
  7. 反馈网络信息改善用户体验
  8. CF888G XOR-MST trie,贪心
  9. html怎么设计自动出现提示的数据列表?怎么设计数据列表像百度一样怎么随用户输入而更新
  10. cglib源码学习交流
  11. ubuntu mysql ftp_Ubuntu服务器安装ftp服务和MySQL数据库配置的一些记录
  12. mongoose在子文档的array里update或insert
  13. signature=d522a0024e7d20dbfee94b566a5dfed5,End-to-end (e2e) application packet flow visibility
  14. linux wegt克隆网站,linux利用wget命令备份网站(镜像拷贝)
  15. 如何手动优化机器学习模型超参数
  16. 分享76网络科技88教育教学47公司企业PPT模板
  17. 面试宝典之深度学习面试题(下)
  18. 打散线条lisp_《湘源修建性详细规划CAD系统》用户使用手册.doc
  19. python的分号用英文还是中文_Python中的分号
  20. 判断字符是数字字符还是大写字符或者是小写字符

热门文章

  1. 史上最贵充电宝iPad Pro问世
  2. REX-Ray 了解
  3. Nginx环境搭建Discuz论坛
  4. 2014.10.1 Form中显示pdf文件
  5. 四十六 常用内建模块 itertools
  6. [活动]《博客园精华集》设计模式分册第2轮筛选结果公示
  7. 美国商务部发布软件物料清单 (SBOM) 的最小元素(上)
  8. 微软公布Netgear 固件严重漏洞详情,可盗取用户身份并攻陷系统
  9. 下载量超1600万的热门开源 JavaScript 序列化包中被曝 RCE 漏洞
  10. 武汉区块链软件技术公司区块链将如何应用于会员生态系统?