如何使用python分析CPU使用情况? 大概是这样吧
前言
现在小编给大家分享一个可以分析CPU使用情况的代码,CPU分析是通过分享CPU执行代码的方式来测量代码的性能,以此来找到代码的不妥之处,然后处理它们,
接下来我们将看看如何跟踪python脚本使用时CPU使用情况,重点关注几个方面 :
1、cProfile
2、line_profiler
3、pprofile
4、vprof
测量CPU使用率,主要使用与内存分析中使用脚本相同的脚本,具体如下:
import time def primes(n): if n == 2 : return [2] elif n < 2: return [] s = [] for i in range(3,n+1) : if i % 2 !=0 : s.append(i) mroot = n ** 0.5 half = (n+1) / 2 - 1 i = 0 m = 3 while m <= mroot : if s[i]: j = (m * m - 3) / 2 s[j] = 0 while j < half : s[j] = 0 j += m i = i + 1 m = 2 * i + 3 l = [2] for x in s : if x: l.append(x) return l def benckmark(): start = time.time() for _ in xrange(40): count = len(primes(1000000)) end = time.time() print "Benchmark duration : %r secounds" % (end - start)
另外,请记住,在PyPy2中,你需要使用与之配合的pip版本:
并且其他依赖项也将被安装:
cProfile
在讨论CPU分析时,最常用的工具之一是cProfile,主要是因为它内置在CPython2和PyPy2中。这是一个确定性的分析器,意味着在运行程序时会收集一组统计数据,例如我们代码的各个部分的执行次数或执行时间。此外,cProfile在系统上的开销比其他内置的分析器(配置文件)要低。
CPython2的用法很简单:
如果你使用PyPy2:
其输出如下:
即使使用这个文本输出,很容易看到我们的脚本多次调用了list.append方法。
如果我们使用gprof2dot,我们可以以图形的方式看到cProfile输出。要使用它,我们必须首先安装graphviz,之后是一些依赖包,最后在Ubuntu上使用如下命令:
再次运行脚本:
我们得到以下output.png文件:
学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴可以私信回复小编“学习”或者评论,留言,点赞 领取全套免费python学习资料、视频()装包
这样更容易看到一切。我们来仔细看看它的输出。你可以看到脚本中的函数调用如下:
第一行:Python文件名,行号和方法名称
第二行:代码块占用全部时间的百分比
第三行:括号中,方法本身占全部时间的百分比
第四行:调用函数的次数
例如,在顶部的第三个红色方块中,方法primes占用了98.28%的时间,其中65.44%的内容在其中进行,调用了40次。其余的时间花在Python中的list.append(22.33%)和range(11.51%)中。
作为一个简单的脚本,我们只需要重写我们的脚本,具体的如下所示:
如果我们使用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的两个循环花了我们脚本中最多的时间。
vprof
vprof是一个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的两个循环花了我们脚本中最多的时间。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
react-native-select-group-buttons-modal 纯RN实现一个多按钮选择Modal
转载请注明出处:王亟亟的大牛之路 开篇之前日常安利https://github.com/ddwhan0123/Useful-Open-Source-Android (各种库的收纳,长期维护) 做这个东西的理由 最近公司的项目做了个通用组建,是RN提供给Native和Naive提供给RN多模块,多语言共用2个组件多东西,然后里面牵涉太多老代码和老业务的东西使得代码比较臃肿(还很LOW),然后又因为很多地方正在用又不能彻底干掉调整。所以自己重写了下然后实现部分功能就有了这么个东西。 安装本库 $ npm install react-native-select-group-buttons-modal --save 使用本库 import RNSelectGroupButtonsModal from 'react-native-select-group-buttons-modal'; <RNSelectGroupButtonsModal settingBuild={this._settingBuild} onPaymentModeChanged={(item, index) => ...
- 下一篇
使用Lambda表达式与回调函数简化缓存操作
1. 缓存操作流程 对一些写低频,读高频的数据操作我们经常需要用到缓存,通常的缓存操作流程如下: 2. 通常的缓存处理方式 通常我们对上面流程的实现,伪代码如下: public Object getObject(String key) { //1. 尝试从缓存读取 Object obj = readFromCache(key); //缓存命中直接返回 if (obj != null) { return obj; } //2.如果缓存未命中,读数据库 obj = readFromDB(); //3. 回写入缓存,并返回 saveToCache(key,obj); return obj; } 对于不同缓存的处理上面步骤1、3是重复的,步骤2是取决
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装Nodejs环境