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

进行分析的辅助类

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

cprofile简介

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

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

Profile类:

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

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

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

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

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

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

pstats简介

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

--pstas模块为开发者提供了Stats类,可以读取和操作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行结果

进行排序的key值

打印数据的解读:

这是得到的一个结果

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

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

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

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

    eg:funA(): 

                funB() 得到tottime = funA()执行的时间-funB()执行的时间

--percall: tottime/ncalls

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

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

一个例子,使用装饰器对一个函数进行分析

import cProfile

import pstats

import functools

def do_cProfile(do=False, order='tottime'):

        def wrapper(func):

                @functools.wraps(func)

                def profiled_func(*args, **kwargs):

                if do:

                    profile = cProfile.Profile()

                    profile.enable()

                    result = func(*args, **kwargs)

                    profile.disable()

                    #profile.print_stats()

                    ps = pstats.Stats(profile).sort_stats(order).strip_dirs()

                    ps.print_stats()

                else:

                result = func(*args, **kwargs)

                return result

        return profiled_func

return wrapper

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

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

from profile_decorator import do_cProfile

@do_cProfile(True)

def funA():...

@do_cProfile(True, calls)

def funB():...

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

参考连接:

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,088评论 0 15
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 513评论 0 0
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,943评论 0 8
  • 引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Python。下面这些问题涉及了与Pytho...
    VanessaC阅读 765评论 0 0
  • “诚是实理,只是一个良知。实理之妙用流行就是神,其萌动处就是几。诙神几曰圣人。圣人不贵前知;祸福之来,虽圣人有所不...
    巴山夜雨DIY阅读 739评论 0 0