• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python如何做代码性能分析

    上一篇文章我们介绍了基准测试,通过基准测试可以发现程序变慢了,那么是因为什么原因导致性能变慢的,需要进一步做代码性能分析。python同样提供了性能分析工具。

    cProfile

    cProfile是python默认的性能分析器,他只测量CPU时间,并不关心内存消耗和其他与内存相关联的信息。

    from time import sleep
    import random
    
    
    def random_list(start, end, length):
        """
        生成随机列表
        :param start: 随机开始数
        :param end: 随机结束数
        :param length: 列表长度
        """
        data_list = []
        for i in range(length):
            data_list.append(random.randint(start, end))
        return data_list
    
    
    def bubble_sort(arr):
        """
        冒泡排序: 对列表进行排序
        :param arr 列表
        """
        n = len(arr)
        sleep(1)
        for i in range(n):
            for j in range(0, n - i - 1):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr
    
    
    if __name__ == '__main__':
        get_data_list = random_list(1, 99, 10)
    
        import cProfile
        cProfile.run('bubble_sort({})'.format(get_data_list))

    继续使用上一篇文章中的例子,引用cProfile模块,run()方法参数说明。

    run(statement, filename=None, sort=-1)

    为了使结果统计出耗时部分,我们加了sleep,结果如下:

    ❯ python demo.py
             6 function calls in 1.004 seconds
    
       Ordered by: standard name
    
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    0.000    0.000    1.004    1.004 string>:1(module>)
            1    0.000    0.000    1.004    1.004 demo.py:19(bubble_sort)
            1    0.000    0.000    1.004    1.004 {built-in method builtins.exec}
            1    0.000    0.000    0.000    0.000 {built-in method builtins.len}
            1    1.004    1.004    1.004    1.004 {built-in method time.sleep}
            1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

    line_profiler

    line_profiler 可以提供有关时间是如何在各行之间分配的信息,直白一点就是给出程序每行的耗时,在无法确定哪行语句最浪费时间,这很有用。

    line_profiler是一个第三方模块,需要安装。

    https://github.com/pyutils/line_profiler

    from time import sleep
    import random
    
    
    def random_list(start, end, length):
        """
        生成随机列表
        :param start: 随机开始数
        :param end: 随机结束数
        :param length: 列表长度
        """
        data_list = []
        for i in range(length):
            data_list.append(random.randint(start, end))
        return data_list
    
    
    @profile
    def bubble_sort(arr):
        """
        冒泡排序: 对列表进行排序
        :param arr 列表
        """
        n = len(arr)
        sleep(1)
        for i in range(n):
            for j in range(0, n - i - 1):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr
    
    
    if __name__ == '__main__':
        get_data_list = random_list(1, 99, 10)
        bubble_sort(get_data_list)

    给需要监控的函数加上@profile 装饰器。通过kernprof命令运行文件(安装完line_profiler生成的命令)。

    参数说明:

    运行结果:

    kernprof -l -v demo.py
    Wrote profile results to demo.py.lprof
    Timer unit: 1e-06 s
    
    Total time: 1.00416 s
    File: demo.py
    Function: bubble_sort at line 18
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
        18                                           @profile
        19                                           def bubble_sort(arr):
        20                                               """
        21                                               冒泡排序: 对列表进行排序
        22                                               :param arr 列表
        23                                               """
        24         1          8.0      8.0      0.0      n = len(arr)
        25         1    1004030.0 1004030.0    100.0      sleep(1)
        26        11         15.0      1.4      0.0      for i in range(n):
        27        55         44.0      0.8      0.0          for j in range(0, n - i - 1):
        28        45         41.0      0.9      0.0              if arr[j] > arr[j + 1]:
        29        20         21.0      1.1      0.0                  arr[j], arr[j + 1] = arr[j + 1], arr[j]
        30         1          1.0      1.0      0.0      return arr

    输出非常直观,分成了6列。

    只需查看% Time列,就可清楚地知道时间都花在了什么地方。

    总结

    性能测试分析站在项目层面是一个很庞大的话题,以前为测试工程师,关注的是性能工具的使用,以及用户维度的性能[1];作为开发工程师,每个功能都是由一个个函数/方法组成,我们去分析每个函数/方法,甚至是每行代码的耗时,才能更好的进行代码层面的性能优化。

    以上就是python如何做代码性能分析的详细内容,更多关于python 代码性能分析的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • python一些性能分析的技巧
    • Python性能分析工具py-spy原理用法解析
    • Python内置类型性能分析过程实例
    • Python性能分析工具Profile使用实例
    • cProfile Python性能分析工具使用详解
    • Python中判断子串存在的性能比较及分析总结
    • 使用pycallgraph分析python代码函数调用流程以及框架解析
    • Python爬虫分析微博热搜关键词的实现代码
    • 使用bandit对目标python代码进行安全函数扫描的案例分析
    • python中delattr删除对象方法的代码分析
    • python3中确保枚举值代码分析
    上一篇:Python字符串对齐方法使用(ljust()、rjust()和center())
    下一篇:python实现监听键盘
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python如何做代码性能分析 python,如何,做,代码,性能,