Python学习笔记25:进阶篇(十四)常见标准库使用之性能测试timeit模块学习使用

news2024/11/26 3:43:31

前言

本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。

根据模块知识,一次讲解单个或者多个模块的内容。

教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html

性能测量

Python中的性能测试主要关注于评估代码执行速度、资源消耗(如内存使用)及扩展性等方面。这有助于开发者识别并优化程序中的瓶颈,确保应用能够高效运行。

水平有限,讲一些关键概念和实践方法,简单写点代码运行一下。

  1. 基准测试 (Benchmarking)
    目的: 基准测试是评估代码片段或整个应用程序在特定条件下的执行性能,通常用来比较不同实现方式的效率。
    工具: 使用 timeit 模块进行简单的重复执行计时,或者 pytest-benchmark 这样的第三方库进行更复杂的测试场景。
    实践: 设定明确的测试环境(如数据集大小、硬件配置),确保测试结果可复现和比较。
  2. 性能剖析 (Profiling)
    目的: 细致地分析代码中各个部分的执行时间,找出耗时最长的部分(热点)。
    工具:
    cProfile:Python 标准库中的性能剖析器,提供函数级别的性能报告。
    line_profiler:第三方库,提供行级的性能分析,适合更细致的性能调优。
    实践: 分析报告,识别瓶颈,针对性地优化代码逻辑或数据结构。
  3. 内存分析
    目的: 监控和分析程序运行过程中的内存使用情况,发现内存泄漏或不高效的内存使用模式。
    工具:
    tracemalloc:Python 标准库,可以在程序运行时跟踪内存分配,帮助定位内存增长的原因。
    memory_profiler:第三方库,提供逐行的内存使用统计。
    实践: 定期检查内存使用报告,优化数据结构,及时释放不再使用的资源。
  4. 并发与异步测试
    目的: 验证多线程、多进程或异步IO等并发策略对性能的影响。
    工具: 使用Python的 concurrent.futures、asyncio 模块进行并发编程,配合上述性能测试工具评估效果。
    实践: 设计合理的并发测试场景,确保线程安全,避免竞争条件。
  5. 压力测试与负载测试
    目的: 模拟高并发或大数据量的场景,测试系统在极限条件下的稳定性和响应时间。
    工具:
    locust:开源负载测试工具,支持编写Python脚本模拟用户行为。
    pytest 结合 pytest-asyncio 或 pytest-xdist 插件,进行并发测试。
    实践: 确定测试目标(如请求/秒、并发用户数),持续监控资源使用情况和响应时间,调整系统配置或代码以提高承载能力。
  6. 注意事项
    环境一致性:确保测试环境(操作系统、Python版本、依赖库版本)尽可能与生产环境一致。
    数据代表性:使用接近真实场景的数据集进行测试,以获得有意义的结果。
    避免过早优化:在确定真正的瓶颈之前,避免无目的的性能优化,因为这可能会增加代码复杂度而没有实际收益。
    性能测试是软件开发周期中的重要环节,它能帮助开发者确保应用不仅功能正确,而且运行高效

代码示例

这里就根据自己查找的资料学习几个模块的一些基础用法

timeit

timeit模块是 Python 标准库中的一个组件,专为度量小段代码执行时间而设计。它通过多次运行代码片段并排除首次运行的启动开销(如编译器预热),来提供精确的平均执行时间。timeit 既可以在命令行界面使用,也可以作为 Python 程序的一部分嵌入使用,非常适合快速评估代码性能和比较不同实现方式的效率。

主要特点:
准确性:通过多次重复执行代码来减少随机误差,提供更准确的执行时间测量。
隔离性:自动处理启动成本,比如模块导入或编译,确保只测量目标代码的执行时间。
易用性:支持简单的命令行界面和Python API,便于在各种环境中使用。
灵活性:允许设置执行次数、预置代码(setup code)等参数,适应不同测试需求。

命令行界面使用这里就不多做介绍了,主要记录一下如何在代码中使用。

常用函数
  1. timeit.timeit(stmt, globals=None, number=1000000)
    • stmt: 要计时的代码字符串。
    • globals: 提供执行代码所需的全局命名空间,通常使用 globals()。
    • number: 执行代码的次数,默认是100万次,可以根据需要调整。
import timeit

# 定义要测试的代码
code = """
x = 0
for i in range(1000):
    x += i
"""

# 使用timeit测量代码执行时间
times = timeit.timeit(code, globals=globals(), number=1000)

# 打印执行时间
print(f"Execution time: {times} seconds")

在代码中,我们代用timeit.timeit函数,测试了code变量所代表的代码执行1000次的耗时。

在这里插入图片描述

  1. timeit.repeat(stmt=‘pass’, setup=‘pass’, timer=, repeat=3, number=1000000)
    • stmt: 要计时的代码字符串。
    • setup: 在每次执行 stmt 之前执行的代码字符串,用于初始化。
    • timer: 计时器类型,默认使用最准确的可用计时器。
    • repeat: 重复执行整个测试的次数,返回每次执行的平均时间。
    • number: 每次测试中 stmt 执行的次数。
setup_code = "from math import sqrt"
test_code = "sqrt(100)"

times = timeit.repeat(setup=setup_code, stmt=test_code, repeat=5, number=1000)
print(f"Execution times: {times}")
print(f"Minimum execution time: {min(times)}")

在这里插入图片描述
这个函数稍微复杂一点点。
第一步是先导入模块,第二步编写要执行的代码,第三步就是执行测试函数了。
根据数据结果我们可以看到先输出了五个执行时间,因为在repeat参数的值传入的是5,相当于这个测试执行了五次。number表示每次执行会执行目标代码1000遍。
最后简单输出了一个五个时间里面最小的执行时间。

结尾

性能测试主要量模块,分两次记录,主要是因为第二个模块有点繁琐。

作业

  1. 使用timeit模块对自己编写的代码进行测试。

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

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

相关文章

视频共享融合赋能平台LntonCVS安防监控平台现场方案实现和应用场景

LntonCVS国标视频融合云平台采用端-边-云一体化架构,部署简单灵活,功能多样化。支持多协议(GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等)和多类型设备接入(IPC/NVR/监控平台)。主要功能包括视频直…

数据中心机柜如何正确选择

选择适合数据中心的机柜是一个综合考量多个因素的过程,以下是一些关键点,帮助您做出正确的选择: 结构与承重: 考虑机柜的类型(开放式或封闭式)、重量载荷能力,确保它能承受数据中心内设备的总重…

期末C语言易错知识点整理

1.在定义多维数组时,除了最左边的维度,其余的维度必须明确指定大小 2.int m[1][4]{4}; 定义的是一个 1 行 4 列的二维数组,初始化时提供了一个元素 4,其余元素默认初始化为 0,因此是正确的。 3.二维数组 a[3][6] 中的索…

flash-Attention2安装和使用

flash-Attention2安装和使用 文章目录 flash-Attention2安装和使用写在前面解决方案 写在前面 就怕你不知道怎么查 pytorch、cuda 的版本 配置cuda:vim ~/.bashrc export CUDA_HOME/usr/local/cuda/ export PATH$PATH:$CUDA_HOME/bin export LD_LIBRARY_PATH$LD_LIB…

分页插件 count有数据,代码不往下执行

如下:如果打印了sql那么当row>0时会有图2下面sql详情的输出 问题出在了分页参数上,pageNum为1,并且pageSize>2才能打印出图二的结果,图一为pageNum值是0,注意,查询第一页,分页应该传入的是1而不是0

松下的台灯值得入手吗?书客、飞利浦真实横评大分享!

我们都知道,无论是学习还是工作,都需要一个良好的照明环境,而台灯就是我们日常生活中非常重要的照明工具。它不仅能够提供额外的光线,还能减少眼睛疲劳,提高我们的工作和学习效率。 所以,选购一款合适的台…

根据后端返回的省市区重新封装树结构(省市区通过children表示)

对比图(截取部分): 注:先看分步,最后会附上完整代码(如果有用,可以给小编点个赞吗?十分感谢) 1.首先将前端返回相同的省份只展示一次 const obj {}; let keyList []r…

安防监控视频平台LntonAIServer视频监控管理平台裸土检测算法技术核心和应用场景

LntonAIServer裸土检测算法是一种基于人工智能技术的创新解决方案,旨在实现对裸土地表的自动识别。以下是对该算法的详细分析: 技术基础: 1、该算法利用深度学习和计算机视觉技术,通过捕捉视频或图像中的关键信息,如…

SDIO学习(2)--SD卡 2.0协议

目录 1 SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 1.3 SD卡特点 2 SD 2.0特点 3 SD 2.0总线拓扑结构 3.1 SD模式 3.2 SPI模式 4 SD 2.0总线协议 5 SD卡寄存器 5.1 OCR寄存器 5.2 CID 寄存器 5.3 CSD 寄存器 5.3.1 CSD结构 5.3.2 CSD寄存器 (CSD Version 2.0)…

软件测试之接口测试(Postman/Jmeter)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口,比如你需要从别的系统来…

从零开始备考CCIE安全,这么做就对了

CCIE Security认证是思科提供的最高级别的安全认证,验证在设计、实施和故障排除复杂的安全网络基础设施方面的能力。 获得CCIE Security认证不仅是对你网络安全专业知识的高度认可,更是职业发展的重要转折。 它能够显著提升你的职业竞争力,为…

制造企业的仓库管理如何做好数据分析?

在竞争激烈的现代制造业环境中,仓库管理成为许多生产制造企业面临的一大挑战。随着产品种类的不断增加和客户需求的日一个型号,仓库不仅要处理物料、半成品和成品,还要应对产品更新换代、不同项目客户的特殊需求等复杂因素。面对这些挑战&…

分布式kettle调度管理平台简介

介绍 Kettle(也称为Pentaho Data Integration)是一款开源的ETL(Extract, Transform, Load)工具,由Pentaho(现为Hitachi Vantara)开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

什么是产线工控安全,如何保障产线设备的安全

什么是产线工控安全? 工控,指的是工业自动化控制,主要利用电子电气、机械、软件组合实现。即是工业控制系统,或者是工厂自动化控制。产线工控安全指的是工业控制系统的数据、网络和系统安全。随着工业信息化的迅猛发展&#xff0…

首户完工!江门市特殊困难老年人家庭适老化改造资助项目初见成效

日前,江门市特殊困难老年人家庭适老化改造项目取得新进展。位于蓬江区杜阮镇的黄伯家,成为“慈善筑迹溢彩同行”江门市特殊困难老年人家庭适老化改造项目资助的首户完工受益户。 黄伯的家由两座旧平房构成,大门门槛处原步差较大,…

spring aop 初探

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary 分析JDK动态代理 生成的代理对象 构造函数,入参为 InvocationHandler public com.sun.proxy.$Proxy164(java.lang.reflect.InvocationHandler) 生成动态代理Class对象&…

免交互和嵌入执行模式

目录 概念 语法格式 统计行数 赋值变量 修改密码​编辑往文件里添加内容 ​编辑​编辑引入变量 整体赋值​编辑 加引号不赋值变量 expect实现免交互 免交互设置密码 免交互切换用户 嵌入执行模式 添加用户并免交互设置密码 免交互登录 传参实现ssh 练习 概念 …

day22--77. 组合+216.组合总和III+17.电话号码的字母组合

一、77. 组合 题目链接:https://leetcode.cn/problems/combinations/ 文章讲解:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv 1.1 初见思路 组合问题用回溯学会使用剪…

Java的异常处理体系

目录 异常处理1、Java的异常类层次结构2、try-catch-finally 使用注意事项3、在Web应用中如何实现全局异常处理机制 异常处理 1、Java的异常类层次结构 其中Error表示程序运行错误 常见的错误类型有: OutOfMemoryError (内存溢出错误) StackOverFlowError (栈内存溢…

计算机等级考试二级Java-第二篇:基本数据类型

1.运算符的优先级以及复杂表达式 优先级运算符结合性1( ) [ ]  .从左到右2!  ~    –从右到左3*  /  %从左到右4  -从左到右5<<  >>  >>>从左到右6<  <  >  >  instanceof从左到右7  !从左到右8&从左到右9^从左到右10|从…