最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python性能之cProfile和line_profile搭配使用!

    正文概述    2020-03-12   222

    Python性能之cProfile和line_profile搭配使用!

    python性能调试过程中最突出的问题就是耗时,性能测试工具有很多,这里介绍cprofile和line_profiler的搭配使用方法。前者返回项目中每个函数的耗时,后者可以分析函数每一行的耗时。

    一,cProfile

    cProfile是python默认的性能分析器

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

    参数分析:

    run(statement, filename=None, sort=-1)
    # statement: 需要测试的代码或者函数(函数名)
    # fielname: 结果保存的位置, 默认为stdout
    # sort: 结果排序方法,常用的有‘cumtime': 累积时间, ’name': 函数名, ‘line': 行号
    # 以及下面结果分析里的’ncalls'等

    使用方法一:

    import re
    import cProfile
    cProfile.run('re.compile("abc")')

    结果分析:

    Python性能之cProfile和line_profile搭配使用!

    第一行:129个函数调用被监控,其中128个是原生调用(不涉及递归)

    ncalls:函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。

    tottime:函数内部消耗的总时间。(可以帮助优化)

    percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。

    cumtime:之前所有子函数消费时间的累计和。

    filename:lineno(function):被分析函数所在文件名、行号、函数名。

    使用方法二:

    import cProfile
    import re
    cProfile.run('re.compile("abc")', 'result.out', 'cumtime')

    使用方法三:控制台

    终端:python -m cProfile -o result.out -s cumulative test.py
    # 效果同方法二

    结果分析:

    结果保存在文件名为result.out的二进制文件里。

    结果读取:pstats模块和Stats类

    import pstats
    def view_profile(path):
        p = pstats.Stats(f"{path}")
        p.sort_stats("cumulative")  # 表示结果按照累计时间耗费排序,其它排序同上
        p.print_stats(3)  # 输出结果 输出结果的前三行,参数还可以是0,1之间的小数,表示输出结果的占比,没有参数表示输出全部结果
        p.print_callers()  # 可以显示函数被哪些函数调用
        p.print_callees()  # 可以显示哪个函数调用了哪些函数

    二,line_profiler

    这个性能分析器和cProfile不同,他能帮你一行一行的分析性能。

    如果瓶颈问题在某一行中,这样就需要line_profiler解决了。

    建议使用kernprof工具

    安装

    pip install line_profiler

    使用方法一:kernprof

    @profile
    def fib(n):
        # 文件名aaa.py
        a, b = 0, 1
        for i in range(0, n):
            a, b = b, a+b
        return a
    fib(5)
    终端:kernprof -l -v aaa.py
    # -l表示逐行分析 -v用于控制台输出, 不加-v会把分析结果写入aaa.py.lprof文件

    使用方法二:函数调用

    from line_profiler import LineProfiler
    def test_line(func_name, parameter=None):
        “”“
        :param: func_name, str, 函数名
        :param: parameter, 函数参数
        ”“”
        lp = LineProfiler()
        lp_wrapper = lp(func_name)
        if parameter is not None:
            lp_wrapper(parameter) #如果有参数,没参数不用写
        lp.print_stats() # 展示结果

    结果分析

    Python性能之cProfile和line_profile搭配使用!

    Line:文件中的行号。

    Hits:性能分析时代码执行的次数。

    Time:一段代码执行的总时间,由计数器决定。

    Per Hit:执行一段代码平均消耗时间。

    % Time:执行一段代码时间消耗比例。

    三,搭配使用

    先用cProfile确定项目中耗时最多的几个函数,然后用line_profiler分析这几个耗时最多的函数,确定行性能瓶颈。

    更多Python知识,请关注Python视频教程!!


    起源地下载网 » Python性能之cProfile和line_profile搭配使用!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元