千锋教育-做有情怀、有良心、有品质的职业教育机构

Python 性能剖分工具

来源:千锋教育
发布时间:2023-11-06 10:12:17
分享

眼看着项目即将完成,却被测试人员告知没有通过性能测试,这种情况在开发中屡见不鲜。接下来的工作就是加班加点地找出性能瓶颈,然后进行优化,再进行性能测试,如此这般周而复始直到通过性能测试。尽管丰富的工作经验有助于性能优化,但只有科学地应用工具才能在最短的时间内找出最佳优化粒度的瓶颈代码段,达到事半功倍的效果。

profile、cProfile与hotshot

Python内置了丰富的性能优化工具来帮助我们定位性能瓶颈,如:profile、cProfile和hotshot。它们易于使用,而且有完备的支持文档可供参考。下面以最常用的profile模块为例来说明它们的使用方法,假定要剖分的脚本文件为foo.py,它的内容如下:

deffoo():

sum=0

foriinrange(100):

sum+=i

returnsum

if__name__=="__main__":

foo()

对foo.py进行性能剖分的方法之一是修改foo.py里的if程序块,引入profile模块:

if__name__=="__main__":

importprofile

profile.run("foo()")

然后执行foo.py即可完成性能剖分,剖分结果将以文本报表的形式打印到标准输出。

因为上述方法需要修改foo.py文件,所以我们通常更倾向于使用无需修改源文件的方法——就是在命令行中用应用python的–m参数来执行profile:

python–mprofilefoo.py

除了可以使用profile模块外,还可以使用cProfile模块。cProfile由C语言实现,是剖分代价更低的剖分器,有和profile模块相同的接口,但只能用于2.5或以上版本。Python另一个内置的剖分器是hotshot,但是hotshot模块已经不再推荐使用,因为将来它可能会被移出标准库。

pstats

无论使用哪个剖分器,它的剖分数据都可以保存到二进制文件,如foo.prof。分析和查看剖分结果文件需要使用pstats模块,它极具伸缩性,可以输出形式多样的文本报表,是文本界面下不可或缺的工具。

使用pstats分析剖分结果很简单,几行代码就可以了:

importpstats

p=pstats.Stats("foo.prof")

p.sort_stats("time").print_stats()

运行上述脚本将输出结果为按函数内部运行时间(不计调用子函数的时间)长短排序的报表。

sort_stats()方法是pstats.Stats最重要的方法之一,它用以对剖分数据进行排序。sort_stats()接受一个字符串参数,这个字符串标识了排序的字段,常用的可选的参数及其意义如下:

ncalls’

被调用次数

‘cumulative’

函数运行的总时间

‘nfl’

Name/file/line

‘time’

函数内部运行时间(不计调用子函数的时间)

除了sort_stats()外,pstats.Stats还有print_callees()和print_callers()方法用以输出指定函数所调用的函数和调用过指定函数的函数。

除了编编程接口外,pstats还提供了友好的命令行交互环境,在命令行执行python–mpstats就可以进入交互环境,在交互环境里可以使用read/add指令读入/加载剖分结果文件,stats指令用以查看报表,callees和callers指令用以查看特定函数的被调用者和调用者。下图是pstats的截图,标识了它的基本使用方法

以上内容为大家介绍了Python性能剖分工具,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。https://www.mobiletrain.org/

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python之metaclass的原理和用法 metaclassmetaclass的英文直译过来就是元类,这既是一个概念也可以认为是Python当中的一个关键字,不管怎么理解,对它的内核含义并没有什么影响。我们可以不必纠结,就认为它是类的类的意思
  • Python之__init__和__new__的区别是什么 真假构造函数如果你去面试Python工程师的岗位,面试官问你,请问Python当中的类的构造函数是什么?你不假思索,当然是__init__啦!如果你这么回答,很有可能你就和offer无缘了。因为在Py
  • Python常用的高级用法之怎么动态创建类 元类是Python当中的高级用法,如果你之前从来没见过这个术语或者是没听说过这个概念,这是非常正常的,因为一方面它的使用频率不高,另外一方面就是它相对不太容易理解。以至于很多Python开发者都理解得
  • Python当中生成器和迭代器的使用 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法。对于获取数据的方法而言,我们会一种就足够了。但是在我后来Python的使用以及TensorFlow等学习使用当中
  • Python工具库之collections collection在英文当中有容器的意思,所以顾名思义,这是一个容器的集合。这个库当中的容器很多,有一些不是很常用,本篇文章选择了其中最常用的几个,一起介绍给大家。defaultdictdefaul
  • Python装饰器 python中的装饰器,本质上就是一个高阶函数。你可能不太清楚高阶函数的定义,没关系,我们可以类比一下。在数学当中高阶导数,比如二次导数,表示导数的导数。那么这里高阶函数自然就是函数的函数,结合我们之