YOLOv5:Profile、Timeout、WorkingDirectory上下文管理器 以及torch.cuda.synchronize()

2023-11-04

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • Python OS模块是负责程序与操作系统的交互,提供了访问操作系统底层的接口和非常丰富的方法用来处理文件和目录。
  • Python contextlib模块提供了一种方便的方式来管理上下文管理器(context manager),它可以帮助我们简化代码,提高可读性和可维护性。contextlib模块提供了以下几个函数:
   contextlib.contextmanager:这个函数可以用来定义上下文管理器,它可以把一个普通的函数变成一个上下文管理器。   
   contextlib.closing:这个函数可以用来包装一个对象,使其可以使用with语句。   
   contextlib.suppress:这个函数可以用来抑制指定的异常,使其不会被抛出。   
   contextlib.redirect_stdout:这个函数可以用来重定向标准输出流。   
   contextlib.ExitStack:这个类可以用来管理多个上下文管理器,它可以让我们在一个with语句中使用多个上下文管理器。

上下文管理器

上下文管理器是Python中的一种特殊对象,它可以用来管理上下文,例如打开和关闭文件、访问数据库等。它们通常使用with语句来实现,它可以确保在with语句块执行完毕后,上下文管理器会被正确的关闭。

with open('test.txt', 'w') as f: # 执行完后,文件会关闭close()。
    f.write('Hello world')
    
with open('test.txt','r') as f: # 执行完后,文件会关闭close()。
    print(f.readlines())
  • with 方法的实现涉及到两个魔法函数__enter__和__exit__。
  • Python魔法函数是Python中的一种特殊函数,它可以用来实现一些特殊的功能,例如访问对象的属性、调用对象的方法等。它可以帮助我们简化代码,提高可读性和可维护性。Python魔法函数有以下几种:
  1. init:这个函数可以用来初始化一个对象,它会在对象被创建时自动调用。
  2. str:这个函数可以用来返回一个字符串,它会在对象被打印时自动调用。
  3. call:这个函数可以用来把一个对象当做函数来调用,它会在对象被调用时自动调用。
  4. getattr:这个函数可以用来访问一个对象的属性,它会在访问一个不存在的属性时自动调用。
  5. setattr:这个函数可以用来设置一个对象的属性,它会在设置一个属性时自动调用。

所谓魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中
比如在类People中自定义__str__函数,则在调用People()时,会自动调用__str__函数,并返回相应的结果。在定义类时,经常使用__init__函数(构造函数)和__del__函数(析构函数),其实这也是魔法函数的一种。
Python中以双下划线(__)开始和结束的函数为魔法函数。
调用类实例化的对象的方法时自动调用魔法函数。
在自己定义的类中,可以实现之前的内置函数。(复写的概念)
执行流进入 with 中的代码块时会执行__enter__方法,它会返回在这个上下文中使用的一个对象。执行流离开 with 块时,则调用这个上下文管理器的__exit__方法来清理所使用的资源

class People(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + ":" + str(self.age)

if __name__=="__main__":
    print(People('FrienshipT',18))

执行结果

FrienshipT:18

自己写一个Context上下文管理器

  • Python中通过继承 contextlib 里面的 ContextDecorator 类,实现对常规上下文管理器类的支持,其不仅可以作为上下文管理器,也可以作为函数修饰符。
import contextlib
class Context(contextlib.ContextDecorator):
    def __init__(self, mode):
        self.mode = mode
        print('__init__({})'.format(self.mode))

    def __enter__(self):
        print('__enter__({})'.format(self.mode))
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__({})'.format(self.mode))


@Context('装饰器')
def print_func(info):
    print(info)
print_func('装饰器运行')
print("\n--------------\n")
with Context('上下文管理器'):
    print('上下文管理器方式运行')

运行结果

__init__(装饰器)
__enter__(装饰器)
装饰器运行
__exit__(装饰器)

--------------

__init__(上下文管理器)
__enter__(上下文管理器)
上下文管理器方式运行
__exit__(上下文管理器)

YOLOv5 ./utils/general.py中的上下文管理器

class Profile(contextlib.ContextDecorator):
    # YOLOv5 Profile class. Usage: @Profile() decorator or 'with Profile():' context manager
    def __init__(self, t=0.0):
        self.t = t
        self.cuda = torch.cuda.is_available()

    def __enter__(self):
        self.start = self.time()
        return self

    def __exit__(self, type, value, traceback):
        self.dt = self.time() - self.start  # delta-time
        self.t += self.dt  # accumulate dt

    def time(self):
        if self.cuda:
            torch.cuda.synchronize()
        return time.time()
if __name__ == "__main__":
    context = Profile()
    with context:
        print('Profile()上下文管理器')

运行结果

__init__ self.t: 0.0
__enter__ self.start: 1677419715.9893756
Profile()上下文管理器
__exit__ self.time(): 1677419715.9894035
__exit__ self.dt(delta-time): 2.5272369384765625e-05
__exit__ self.t(accumulate-dt): 2.5272369384765625e-05

Profile主要是计算时间的

torch.cuda.synchronize()
等待当前设备上所有流中的所有核心完成。
测试时间的代码
代码1

start = time.time()
result = model(input)
end = time.time()

代码2

torch.cuda.synchronize()
start = time.time()
result = model(input)
torch.cuda.synchronize()
end = time.time()

代码2是正确的。因为在pytorch里面,程序的执行都是异步的。
如果采用代码1,测试的时间会很短,因为执行完end=time.time()程序就退出了,后台的cu也因为python的退出退出了。
如果采用代码2,代码会同步cuda的操作,等待gpu上的操作都完成了再继续成形end = time.time()
代码3

start = time.time()
result = model(input)
print(result)
end = time.time()

如果将代码1改为代码3 ,代码3和代码2的时间是类似的。
因为代码3会等待gpu上的结果执行完传给print函数,所以时间就和代码2同步的操作的时间基本上是一致的了。
将print(result)换成result.cpu()结果是一致的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv5:Profile、Timeout、WorkingDirectory上下文管理器 以及torch.cuda.synchronize() 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • Mysql存储过程和函数区别介绍

    存储存储过程 是一段代码 过程 存储在数据库中的SQL组成 一个存储过程通常用于完成一段业务逻辑 例如报名 交班费 订单入库等 而一个函数通常专注与某个功能 视为其他程序服务的 需要在其他语句中调用函数才可以 而存储过程不能被其他调用 是自
  • C语言每日一练 —— 第21天:算法的应用

    文章目录 前言 一 算法简介 1 推荐算法 2 最短路算法 3 最值算法 4 排序算法 5 压缩算法 6 加密算法 二 为什么要学算法 1 面试时 2 工作中 三 算法能给我们带来什么能力的提升 1 抽象问题的能力 2 解决问题的能力 3
  • AI绘图实战(四):制作食品安全PPT所用的相关图片png、图标icon

    S 你安装stable diffusion就是为了看小姐姐么 I 当然不是 当然是为了公司的发展谋出路 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题 Windo
  • 【华为OD机试】玩牌高手【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给定一个长度为n的整型数组 表示一个选手在n轮内可选择的牌面分数 选手基于规则选牌 请计算所有轮结束后其可以获得的最高总分数 选择规则如下 1 在每轮里选手可以选择获
  • 读写配置文件中的数据

    主要的读取函数 DWORD dwCharacters GetPrivateProfileString strFieldName 节名 strKeyName 键名 strDefault 如果键名不存在 搜索默认键 strTemp GetBuf
  • 微信支付教程

    使用前说明 你必须拥有微信服务号并认证 微信认证每年300元 比较坑 已经开通微信支付商户 网站域名必须备案 PHP5 4或以上的版本并且服务器已安装PHP curl组件 第一步 下载示例代码 https pay weixin qq com
  • 时间序列预测--ARIMA、LSTM

    时间序列预测 ARIMA LSTM ARIMA ARIMA模型全称为差分自回归移动平均模型 Auto regressive Integrated Moving Average Model 简记ARIMA ARIMA p d q 称为差分自回
  • 大话自由职业之区块链

    初稿 marker 在不久的将来 可见的未来 区块链将深刻的改变我们生活工作交流的方式 不久的将来 可见的未来 我们的社会衡量经济水平的标准或许不是就业人口数量 而是自由职业人口数量 不久的将来 可见的未来 我们的工作合作的关系或许不再有公
  • 关于java中File类的总结

    1 File类只是操作文件 不涉及内容 2 File类的重要方法 设置完整路径 public File String filename 删除文件 public boolean delete 判断文件是否存在 public boolean e
  • Commit message全局安装

    Git Commit Message 全局安装 开发环境 电脑系统 Windows 10 64位系统 调试工具 PowerShell Git cnpm Commit Message 格式 使用 Angular 团队的规范 其Commit M
  • WINDOWS 命令行 串口 COM 发送数据

    WINDOWS 命令 串口 数据 type con gt com1 回车 com1 为想发送的串口 输入字符并回车即可 转载于 https www cnblogs com runliuv p 9817126 html
  • windows10: vscode conda activate CommandNotFoundError

    Windows10 在vscode中自动激活环境报错 CommandNotFoundError 转载自 https www cnblogs com weixia blog p 11408125 html 最近重装了系统 装完anaconda
  • 小程序微信支付

    微信小程序实现支付功能 1 准备工作 在开始实现微信小程序支付功能之前 我们需要先完成以下准备工作 注册微信支付商户号 并完成商户资质审核 微信支付开发文档 在小程序中引入微信支付JSAPI 获取用户的openid 用于发起支付请求 2 支
  • 【Python】模块

    模块 就类似于我们生活中的工具包 Python中的源程序可以作为模块 我们需要使用时 直接将模块导入到我们需要使用的源程序中即可 目录 模块 导入模块 模块导入原理 局部导入 包 包的定义 模块的使用 模块 导入模块 我们导入模块使用的是i
  • Mybatis-Plus查询或更新报错

    报错 Error evaluating expression ew null and ew sqlFirst null Cause org apache ibatis ognl OgnlException sqlFirst 原因 Query
  • SD-WAN与MPLS VPN,MSTP,IPSEC VPN,SSL VPN有什么区别?

    对于目前市场上主流的SD WAN MPLS VPN SSL VPN IPSec VPN和MSTP等企业组网技术 想必大家一定不陌生 其实 MPLS VPN IPSec VPN SSL VPN都属于采用IP VPN技术的产品 IP VPN 虚
  • 重新启动elasticsearch 报错:org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException:

    cmd命令重新启动elasticsearch 报错 org elasticsearch bootstrap StartupException java lang IllegalStateException failed to obtain
  • java连接oracle数据库的各种方法及java在数据库中的含义

    java连接oracle数据库的各种方法及java在数据库中的含义 java与oracle的接口 在数据库中运行JAVA可以说是ORACLE8i的最令人激动的新特性 在你创建的使用ORACLE8i 数据库的应用程序中 你可以使用与JAVA有
  • 转载:图像噪声的成因分类与常见图像去噪算法简介

    本文转载自博客园博主淇淇宝贝 图像的空域噪声以及二维降噪算法介绍 1 图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质 这对后续图像的处理和图像视觉效应将产生不利影响 噪声种类很多 比如 电噪声 机械噪声 信
  • YOLOv5:Profile、Timeout、WorkingDirectory上下文管理器 以及torch.cuda.synchronize()

    相关介绍 Python是一种跨平台的计算机程序设计语言 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 最初被设计用于编写自动化脚本 shell 随着版本的不断更新和语言新功能的添加 越多被用于独立的 大型项目的开发 Pyt