python代码性能分析

news2024/12/24 3:01:37

基准测试可以发现程序变慢了,那么是因为什么原因导致性能变慢的,需要进一步做代码性能分析。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];作为开发工程师,每个功能都是由一个个函数/方法组成,我们去分析每个函数/方法,甚至是每行代码的耗时,才能更好的进行代码层面的性能优化。

                                                             

作为一位过来人也是希望大家少走一些弯路,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!

留【自动化测试】即可

【软件测试交流】:320231853(备注C)icon-default.png?t=N5F7http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PQRm3Jie8GSy22OzvQ4omxI7VM7WLF56&authKey=qXXk2NfG3j%2BXrGjwI4MLmG8fC2f9QQeEpS9HhdpRwhPceujFtwPkCMoSgI5E7ahd&noverify=0&group_code=320231853

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逻辑越权之找回机制及接口安全(35)

会涉及到这三个内容 验证会涉及到&#xff0c;暴力测试&#xff0c;绕过测试 找回会涉及到&#xff0c;客户端回显&#xff0c;respponse状态值&#xff0c;找回流程绕过 接口会涉及到&#xff0c;调用便利 找回就像是忘记密码那种&#xff0c;然后会有验证&#xff0c;手机…

知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构。在化学领域,知识图谱可以应用于化学物质结构上。化学物质结构主要指分子结构和化学键的组成情况。知识图谱可以将化学物质结构的相关数据以图谱的形式展…

oVirt 4.4.10三节点超融合集群安装配置及集群扩容(三)

本篇主要记录安装及使用过程中遇到的问题<包含4.4.x, 4.5.x> 设置engine管理页面可以通过IP访问ssh连接engine服务器并在/etc/ovirt-engine/engine.conf.d新建99-custom-sso-setup.conf,添加engine节点的IP或出口IPSSO_ALTERNATE_ENGINE_FQDNS="engine103.cluster.…

MySQL 索引与事务

MySQL 索引相关知识详解与事务的详解 一、索引的概念二、索引的作用索引的副作用 三、索引是如何实现的四、创建索引的原则依据五、索引的优缺点1、优点2、缺点 六、索引的分类和创建1、普通索引2、唯一索引3、主键索引4、组合索引5、全文索引 七、索引的查看八、索引的删除1、…

操作系统2:进程的描述与控制

目录 1、什么是前驱图&#xff1f; 2、进程的定义和描述 &#xff08;1&#xff09;什么是进程&#xff1f; &#xff08;2&#xff09;进程的基本状态及转换 &#xff08;3&#xff09;挂起操作和进程状态的转换 3、进程管理中的数据结构 &#xff08;1&#xff09;进程…

楼宇照明系统在图书馆的应用介绍 安科瑞 许敏

【摘要】EIB总线作为楼宇家居自动化控制技术的主流&#xff0c;具有适应性好、功能强大与可靠性高等多方面优点&#xff0c;能很 好地满足定时、合成照度、人体检测和手控等不同的照明控制需求。通过智能化的自动控制实现了楼宇的舒适照 明和节能照明两大目标&#xff0c;克服传…

一、DSMP/OLS等夜间灯光数据贫困地区识别——理论

一、前言 对于贫困的定量研究,前人多实用传统的社会经济统计数据构建模型,但是该数据存在统计口径多源、样本获取受限等不足,不能较好的反映区域贫困的时间按序列编号。随着遥感技术的不断发展,DMSP/OLS等夜间灯光数据的广泛应用为了大范围、动态的区域贫困监测提供一种新…

c++系列之string类的常用接口函数

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; string string时表示字符串的字符类 //使用 string类包含#include 头文件 以及…

基于Java人事管理信息系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

fast admin 使用百度富文本编辑器添加赋值

这篇文章为大家介绍一下fastadmin框架如何引入并使用百度富文本 文章目录 前言下载文件编辑文件配置上传图片添加代码总结 前言 在学习fastadmin的时候需要使用到富文本编辑器&#xff0c;于是查阅了一下资料&#xff0c;实现后将我的经验分享给大家 一、下载文件并放入自己的…

es6的模块化 import()方法进行动态加载模块

import 语句和import()方法是不一样的 import 语句是在编译的时候起作用&#xff0c;if&#xff08;&#xff09;{import 语句} 这句话在编译的时候不会执行if语句&#xff0c;会报错 import 语句无法在运行时加载模块&#xff0c;在语法上&#xff0c;按条件加载模块是不行…

Andriod开发 fragment

1.fragment fragment是一个可以嵌入到Activity中的可重用UI组件。它可以让你在一个Activity中展示多个界面&#xff0c;并且可以在运行时动态地添加、移除、替换和组合不同的fragment&#xff0c;从而实现复杂的UI交互效果。 与Activity类似&#xff0c;Fragment也有自己的生…

Linux监控Raid磁盘健康状态

Raid卡型号与操作 Raid卡市场主要是LSI、Adaptec、Highpoint、Promise等厂商提供。Adaptac被PMC收购后&#xff0c;提供的Raid卡即为PMC,简称为P卡。LSI公司提供的Raid卡&#xff0c;即为L卡。 Raid卡配置操作方式 Raid配置可以通过BIOS启动后进入Raid的配置页面进行配置&#…

【Proteus仿真】74HC192功能验证

前言 74HC192是一种四位可向上或向下计数的计数器芯片&#xff0c;可用于电子设备中的计数器、定时器和频率计等应用。74HC192的模式可以分为4种&#xff0c;向上计数&#xff0c;向下计数&#xff0c;并行输入&#xff0c;重置。还有就是&#xff0c;仿真中一些引脚的名称可能…

【硬件】嵌入式电子设计基础之单片机

本篇文章介绍了基于单片机平台开发的一些基本理论知识&#xff0c;包括了硬件最小系统的说明以及基于单片机开发的过程。文中还额外介绍了ARM体系架构&#xff0c;帮助读者从更深层次去熟悉我们平常最容易接触的开发平台&#xff0c;熟悉这些寄存器定义和处理器模式能够帮助我们…

为什么说网络安全是IT行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

Python实现京东茅台抢购脚本, 原来这么简单

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 京东茅台抢购脚本可以分为以下几部分&#xff0c;具体实现步骤如下&#xff1a; 1. 登录京东账号 首先需要登录京东账号。 一个简单的方式是使用Pyth…

Linux 读书笔记之《鸟哥的 Linux 私房菜 基础学习篇(第四版)》

文章目录 鸟哥 Linux 私房菜&#xff08;基础学习篇&#xff09;第零章、计算器概论第一章、Linux 是什么与如何学习第二章、主机规划与磁盘分区第四章、首次登入与在线求助第五章、Linux 的文件权限与目录配置第六章、Linux 文件与目录管理第七章、Linux 磁盘与文件系统管理第…

springCloudAlibaba组件-Nacos-服务发现与负载均衡(三)

文章目录 服务发现概述服务发现两种形式nacos的负载均衡机制 服务发现概述 如果项目使用微服务架构&#xff0c;如果A微服务需要访问B微服务&#xff0c;需要http请求进行调用&#xff0c;当然需要B微服务的地址与端口号&#xff0c;微服务可以向之前提到的服务中心进行获取B服…

U盘无法格式化?快速解决方法大揭秘!

简介&#xff1a;本文将介绍如何解决U盘无法格式化的问题&#xff0c;并提供快速解决方法。无法格式化的U盘可能会导致数据无法读取或写入&#xff0c;因此解决这个问题具有重要价值。 工具原料&#xff1a; 电脑品牌型号&#xff1a;Lenovo ThinkPad T480 操作系统版本&…