源 | 网络 整理 | IT运维技术圈
在这篇文章中,我将讨论一个工具,用以分析Python中CPU使用情况。CPU分析是通过分析CPU执行代码的方式来测量代码的性能,以此找到代码中的不妥之处,然后处理它们。
接下来我们将看看如何跟踪Python脚本使用时CPU使用情况,重点关注以下几个方面:1、cProfile2、line_profiler3、pprofile4、vprof
测量CPU使用率对于这篇文章,我将主要使用与内存分析中使用脚本相同的脚本,具体如下:
importtime
defprimes(n):
ifn == 2:
return[2]
elifn < 2:
return[]
s=[]
fori in range(3, n + 1):
ifi % 2 != 0:
s.append(i)
mroot=n ** 0.5
half=(n + 1) / 2 – 1
i=0
m=3
whilem <= mroot:
ifs[i]:
j=(m * m – 3) / 2
s[j]=0
whilej < half:
s[j]=0
j+= m
i=i + 1
m=2 * i + 3
l=[2]
forx in s:
ifx:
l.append(x)
returnl
defbenchmark():
start=time.time()
for_ in xrange(40):
count=len(primes(1000000))
end=time.time()
"Benchmarkduration: %r seconds" % (end–start)
benchmark()
另外,请记住,在PyPy2中,您需要使用与之配合的pip版本:
并且其他依赖项也将被安装:
cProfile在讨论CPU分析时,最常用的工具之一是cProfile,主要是因为它内置在CPython2和PyPy2中。这是一个确定性的分析器,意味着在运行程序时会收集一组统计数据,例如我们代码的各个部分的执行次数或执行时间。此外,cProfile在系统上的开销比其他内置的分析器(配置文件)要低。CPython2的用法很简单:
如果您使用PyPy2:
其输出如下:
即使使用这个文本输出,很容易看到我们的脚本多次调用了list.append方法。如果我们使用gprof2dot,我们可以以图形的方式看到cProfile输出。要使用它,我们必须首先安装graphviz,之后是一些依赖包,最后在Ubuntu上使用如下命令:
再次运行脚本:
我们得到以下output.png文件:
这样更容易看到一切。我们来仔细看看它的输出。您可以看到脚本中的函数调用如下:1、第一行:Python文件名,行号和方法名称2、第二行:代码块占用全部时间的百分比3、第三行:括号中,方法本身占全部时间的百分比4、第四行:调用函数的次数例如,在顶部的第三个红色方块中,方法primes占用了98.28%的时间,其中65.44%的内容在其中进行,调用了40次。其余的时间花在Python中的list.append(22.33%)和range(11.51%)中。作为一个简单的脚本,我们只需要重写我们的脚本,具体的如下所示:
importtime
defprimes(n):
ifn == 2:
return[2]
elifn < 2:
return[]
s=range(3, n + 1, 2)
mroot=n ** 0.5
half=(n + 1) / 2–1
i=0
m=3
whilem <= mroot:
ifs[i]:
j=(m * m–3) / 2
s[j]=0
whilej < half:
s[j]=0
j+= m
i=i + 1
m=2 * i + 3
return[2] + [x for x in s if x]
defbenchmark():
start=time.time()
for_ in xrange(40):
count=len(primes(1000000))
end=time.time()
"Benchmarkduration: %r seconds" % (end–start)
benchmark()
如果我们使用CPython2测量我们脚本的时间,
还有PyPy2:
我们通过使用PyPy2的CPython2和3.1X获得了不错的效果,下面是cProfile的调用流程图:
您还可以以编程方式使用cProfile,例如:
这在某些情况下很有用,例如多进程性能测量
line_profiler此分析器在行级提供关于工作负载的信息。它使用Cython在C中实现,并将其与cProfile进行比较时发现其具有较小的开销。源代码可以在这里找到,也可以在这里找到PyPI页面。与cProfile相比,它具有一样的开销,不过却要花费12倍的时间来获取配置文件。要使用它,您需要先通过pip添加它:pip install pip install Cython ipython == 5.4.1 line_profiler(CPython2)。这个分析器的一个主要缺点是它不支持PyPy。就像使用memory_profiler一样,您需要在要分析的函数中添加一个装饰器。在我们的例子中,您需要在03.primes-v1.py中定义我们的primes函数之前添加@profile。然后调用它:
你将得到如下输出:
我们看到,重复调用list.append的两个循环花了最多的时间。
pprofile根据作者说明,pprofile是一个线程测量和统计的纯python分析器。它受到line_profiler的启发,修复了很多缺点,但是由于它完全用Python编写,所以它也可以与PyPy成功使用。与cProfile相比,使用CPython时的分析时间要多28倍,而使用PyPy时,分析时间要多10倍,而且细节水平更加细化。我们也支持PyPy!除此之外,它支持剖析线程,这在各种情况下可能会很方便。要使用它,您需要先通过pip添加它:pip install pprofile(CPython2)/ pypy -m pip install pprofile(PyPy),然后调用它:
输出与我们以前看到的不同,我们得到如下结果:
我们现在可以更详细地看到一切。让我们来看看输出。您可以获得脚本的整个输出,并且在每行之前,您可以看到对其进行的调用次数,运行时间(秒),每次调用的时间和全局时间的百分比,pprofile为我们的输出添加了额外的行(如第44和50行,以(call)开头)与累积指标。再次,我们看到,重复调用list.append的两个循环花了我们脚本中最多的时间。
vprofvprof是一个Python分析器,为各种Python程序特性(如运行时间和内存使用)提供丰富的交互式可视化。它是一个基于Node.JS的图形化的显示在网页中的结果。使用它,您可以看到与Python脚本相关的以下一个或全部:1、CPU使用图2、代码分析3、内存图4、代码热图要使用它,您需要先通过pip添加它:pip install vprof(CPython2)/ pypy -m pip install vprof(PyPy),然后调用它:在CPython2上,显示代码散热图(第一个调用如下)和代码分析(下面的第二个调用):
在PyPy上,显示代码散热图(第一个调用如下)和代码分析(下面的第二个调用):
在每种情况下,您将看到代码散点图的以下内容
以及代码分析的以下内容。
结果以图形方式看到,我们可以悬停鼠标或单击每行以获取更多信息。再次,我们看到,重复调用list.append的两个循环花了我们脚本中最多的时间。英文原文:https://pythonfiles.wordpress.com/2017/06/01/hunting-performance-in-python-code-part-3/
小编有话说
➤推荐服务:
向下滑动查看更多
点击【IT面试精选】查看全网最权威的一线大厂面试真题及面试经验,每天更新哦!
点击【IT路边社】查看实时更新的IT新闻资讯
点击【互联网资料存储站】获取全网最全运维流程文档、表格、脚本、架构、等保资料等点击【安全加固】获取最新安全加固脚本
点击【一键iptables脚本】获取iptables自动设置脚本
回复【加群】群满啦!~添加波哥微信拉您进群!
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容