加入收藏 | 设为首页 | 会员中心 | 我要投稿 周口站长网 (https://www.0394zz.cn/)- 数据采集、智能营销、经验、云计算、专属主机!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

python中怎样对代码性能分析?这些工具要知道

发布时间:2022-03-15 14:06:42 所属栏目:语言 来源:互联网
导读:python中怎样做代码性能分析?做代码性能分析能够帮我们了解什么原因导致性能变慢,因此大家学习python代码性能分析也是很有必要的。而python就有提供性能分析工具,下面我们就来具体看看。 cProfile cProfile是python默认的性能分析器,他只测量CPU时间,并
        python中怎样做代码性能分析?做代码性能分析能够帮我们了解什么原因导致性能变慢,因此大家学习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)
 
statement: 需要测试的代码或者函数(函数名)
fielname: 结果保存的位置, 默认为stdout
sort: 结果排序方法,常用的有cumtime: 累积时间, name: 函数名, line: 行号
        为了使结果统计出耗时部分,我们加了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}
6 function calls in 1.004 seconds 6个函数调用被监控,耗时1.004秒。
ncalls 函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。
tottime 函数内部消耗的总时间。(可以帮助优化)
percall 是tottime除以ncalls,一个函数每次调用平均消耗时间。
cumtime 之前所有子函数消费时间的累计和。
filename:lineno(function) 被分析函数所在文件名、行号、函数名。
    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生成的命令)。
 
        参数说明:
 
-l:以使用函数line_profiler
-v:以立即将结果打印到屏幕
        运行结果:
 
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列。
 
Line #:运行的代码行号。
Hits:代码行运行的次数。
Time:代码行的执行时间,单位为微秒。
Per Hit:Time/Hits。
% Time:代码行总执行时间所占的百分比。
Line Contents:代码行的内容。
        只需查看% Time列,就可清楚地知道时间都花在了什么地方。
 
    总结
        性能测试分析站在项目层面是一个很庞大的话题,以前为测试工程师,关注的是性能工具的使用,以及用户维度的性能[1];作为开发工程师,每个功能都是由一个个函数/方法组成,我们去分析每个函数/方法,甚至是每行代码的耗时,才能更好的进行代码层面的性能优化。

(编辑:周口站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读