Python通过装饰器并使用cprofile对函数进行性能分析

Python013

Python通过装饰器并使用cprofile对函数进行性能分析,第1张

Python中提供了很多接口方便我们能够灵活进行性能分析,包括cProfile模块中的Profile类和pstat模块中的Stats类。

--cprofile是一种确定性分析器,只测量CPU时间,并不关心内存的消耗情况和其他与内存相关联的信息

--它是基于Isprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序

--enable(): 开始进行性能分析并收集数据

--disableI(): 停止性能分析

--create_stats(): 停止收集数据,并为已经收集的数据创建stats对象

--print_stats():创建stats对象并打印分析结果

--dump_stats(filename): 把当前性能分析的内容写入文件filename中

--runcall(func, *args, **kwargs): 收集被调用函数func的性能分析信息

--用来分析cProfile输出的文件内容

--pstas模块为开发者提供了Stats类,可以读取和操作stats文件

(Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源。)

--strip_dirs(): 删除报告中所有函数文件名的路径信息

--dump_stats(filename): 把stats中的分析数据写入文件(也可以写成cProfile.Profile.dump_stats())

--sort_stats(*keys): 对报告列表进行排序,函数会一次按照传入的参数排序

--reverse_order(): 逆反当前的排序

--print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行结果

--第一行表示运行这个函数一共使用0.043秒,执行了845次函数调用

--第二行表示结果是按什么顺序排列的(这里表示按照调用次数来进行排列的)

--ncalls: 表示函数调用的次数(有两个数值表示有递归调用,总调用次数/原生调用次数)

--tottime: 函数内部调用时间(不包括他自己调用的其他函数时间)

--percall: tottime/ncalls

--cumtime: 表示累计调用时间(函数执行玩的总时间),它包含了函数自己内部调用的函数时间

--filename:lineno(function): 函数所在的文件,行号,函数名称

上面的函数do_cProfile(do=False, order='tottime')是一个带参数的装饰器,通过do的值来进行性能分析的开关控制,通过order的值来选择输出结果按照什么方式进行排序。

比如我们对函数A和函数B进行性能分析

如果不给装饰器传入参数的话就是默认的False和tottime

https://zhuanlan.zhihu.com/p/24495603

https://blog.csdn.net/weixin_40304570/article/details/79459811

numpy/scipy底层都是纯C的,性能不会比来matlab差。scikit-learn,

genism等都是建立在numpy/scipy之上。源python只是提供了一个胶水层。另外纯python部分百也可以再用pypy

jit一下,性能相当可观度

c语言相对比较难。

Python上手简单有交互性强的开发环境,还有众多的第三方库,学习起来会比C/C++容易的多。但是C语言作为大学第一种编程语言,众多高校会这么选择,是因为C语言相对其他编程语言,会更好的打好基础,便于以后学习其他知识。

Python和C语言各有各的优势,Python的语法非常特殊,Python是由空格严格控制的,这对于刚接触编程的人来说并不好。目前没有使用与Python相同语法的语言出现。如果用C语言来开始编程可以更好地掌握编程的基础,理解代码的操作原理,但是学习C语言比较枯燥的,容易打击学习积极性。

想了解更多有关Python和C语言的详情,推荐咨询达内教育。达内教育致力于面向IT互联网行业,培养软件开发工程师、测试工程师、UI设计师、网络营销工程师、会计等职场人才,目前已在北上海广深等70个大中城市成立了342家学习中心;更是与多家企业签订人才培养协议,全面助力学员更好就业。感兴趣的话点击此处,免费学习一下