首页 > 编程语言 >python 中如何快速查看代码的性能 DebugInfo 秒表装饰器

python 中如何快速查看代码的性能 DebugInfo 秒表装饰器

时间:2023-08-17 21:33:03浏览次数:45  
标签:python 方法 最终 DebugInfo time 秒表 装饰

背景

我们在 python 编程时,在有性能优化需求的场景下,我们可能一个需求存在多个解决方案的情况,这些解决方案可能在不同的 模块/库 中实现。

那么对于可以实现两样的功能,但实现方式不同的情况下,我们直接测试一下每个方式的运行性能,是最直观评估不同的实现方案性能的办法。

一般解决方法

于是就有了对需求实现方案运行时间进行计算的需求。如下的代码中,【方法1】和【方法2】 实现同样的结果。实现逻辑略有不同。

# -*- coding:UTF-8 -*-

def 方法1():
    最终结果 = 0
    for 次数 in range(1000000000):
        最终结果 = 次数
    return 最终结果


def 方法2():
    最终结果: int
    for 最终结果 in range(1000000000):
        pass

    return 最终结果


if __name__ == '__main__':

    开始时间 = time.time()
    print(方法1())
    结束时间 = time.time()
    print('方法 1 执行了 {}s'.format(结束时间 - 开始时间))

    开始时间 = time.time()
    print(方法2())
    结束时间 = time.time()
    print('方法 2 执行了 {}s'.format(结束时间 - 开始时间))

在以上代码中,为了测试【方法1】和【方法2】的性能,使用了 time.time() 函数分别计算了两个方法执行开始和结的时间戳,然后做减法计算其运行时间。代码的打印效果如下:

python 中如何快速查看代码的性能 DebugInfo 秒表装饰器_运行时间

事实上,这种计算某一个方法的执行时间的需求,往往都是临时性的需求。这种需要记录方法执行前后时间,再做减法计算时间差的做法,反而显得有些繁琐。

DebugInfo 秒表装饰器

DebugInfo 模块中,有一个秒表装饰器,可以非常方便的对我们需要观察性能的方法进行装饰。以下演示其用法。

pip install DebugInfo

修改上文的测试代码,使用 秒表对【方法1】和【方法2】进行装饰。如下:

# -*- coding:UTF-8 -*-

# region 引入调试模块
import os

try:
    from DebugInfo.DebugInfo import *
except ImportError as impErr:
    print('尝试引入 DebugInfo 模块时出现异常:', impErr)
    os.system('pip install DebugInfo')
    try:
        from DebugInfo.DebugInfo import *
    except ImportError as e:
        print('尝试引入 DebugInfo 模块时再次出现异常:', impErr)
        exit(0)

# endregion


@秒表
def 方法1():
    最终结果 = 0
    for 次数 in range(1000000000):
        最终结果 = 次数
    return 最终结果


@秒表
def 方法2():
    最终结果: int
    for 最终结果 in range(1000000000):
        pass

    return 最终结果


if __name__ == '__main__':
    print(方法1())

    print(方法2())

以上代码引入了 DebugInfo 模块,使用其中的 秒表 装饰器装饰了【方法1】和【方法2】,在主程序中正常的调用【方法1】和【方法2】,秒表装饰器即可以打印被装饰的方法的运行时间信息,清晰明了,效果如下:

python 中如何快速查看代码的性能 DebugInfo 秒表装饰器_运行时间_02

我们观察到,秒表装饰器详细的记录并打印了两个方法的执行时间信息,其中包括了以下内容:

  • 被测试的方法的名称 方
  • 法开始执行的时间
  • time.time 记录的执行时间
  • time.perf_counter 记录的执行时间
  • time.process_time 记录的执行时间

装饰器可以非常方便的取消,例如以上代码中,我们通过观察发现【方法1】用时要比【方法2】长,说明【方法2】执行效率要比【方法1】高。从而我们保留【方法2】,取消 秒表 装饰,即可恢复正常程序逻辑。

智能计时单位

秒表装饰器对于极简单的代码逻辑方法,也是支持计时的,例如下面的方法只循环一次。

# -*- coding:UTF-8 -*-

@秒表
def 方法1():
    最终结果 = 0
    for 次数 in range(1):
        最终结果 = 次数
    return 最终结果


@秒表
def 方法2():
    最终结果: int
    for 最终结果 in range(1):
        pass

    return 最终结果

秒表装饰器的效果如下, 我们可以看到秒表计时的单位自动切换为了㎲ us

python 中如何快速查看代码的性能 DebugInfo 秒表装饰器_执行时间_03

小结

以上就是给大家分享的 DebugInfo 模块中的一个 秒表 装饰器的用法,可以协助优化具体的算法性能。

Pyinstrument

如果大家需要总体审查代码的性能瓶径,Pyinstrument 是更合适的工具哈。

标签:python,方法,最终,DebugInfo,time,秒表,装饰
From: https://blog.51cto.com/u_16227127/7127457

相关文章

  • linux利用软链接快速切换python环境
    首先下载python环境编译安装这里就不在追叙目前的python环境一般python都会出现再/usr/bin/这里都是软连接 指向对应执行文件 然后来到我们下载的python环境下找到python执行环境 然后将这文件连接到 /usr/bin/ 下ln-s源地址目的地址ln-s/www/server/p......
  • 2023年第 16期《Python接口自动化+Playwright 》课程,9月10号开学(课程全面升级!)!
    2023年第16期《Python接口自动化+Playwright》课程课程,9月10号开学(课程全面升级!)主讲老师:上海-悠悠上课方式:微信群视频在线教学,方便交流本期上课时间:2023年9月10号-2023年12月3号,晚上20:30-22:30报名费:报名费3000一人(周期3个月)联系微信/QQ:283340479课表如下直播课程主......
  • python3-输入输出,File, OS, 错误和异常
     1. 输入输出,1.1输出 表达式语句print()函数。第三种方式是使用文件对象的write()方法,标准输出文件可以用sys.stdout引用。 输出格式美化如果你希望输出的形式更加多样,可以使用str.format()函数来格式化输出值。如果你希望将输出的值转成字符串,可以使用......
  • 软件测试|Linux下Python安装配置指南
    在Linux中安装Python是一个简单而且重要的过程,因为Python是一种广泛使用的编程语言,许多系统工具和应用都依赖于它。在本文中,我将详细介绍如何在Linux系统中安装Python。请注意,在本文中,我将以Centos为例,但是这些步骤大多数也适用于其他基于RedHat的发行版。对于其他发行版,请使用相应......
  • Python小项目:通过商品条形码查询商品信息
    完整项目下载:下载链接1商品条形码平日大家会购买许许多多的商品,无论是饮料、食品、药品、日用品等在商品的包装上都会有条形码。商品条形码包括零售商品、非零售商品、物流单元、位置的代码和条码标识。我国采用国际通用的商品代码及条码标识体系,推广应用商品条形码,建立我国......
  • Python小项目:利用tkinter与图灵机器人制作智能聊天系统
    1前言在本项目中,我们将探索如何使用Python的tkinter库以及图灵机器人API来构建一个智能聊天系统。本项目的初衷是通过实际操作,结合GUI编程和API调用,展示如何创建一个有趣且实用的小应用。我们将借助tkinter创建一个类似QQ聊天框的界面,并使用图灵机器人的API来实现自动化的智能聊......
  • python rasa聊天机器人教程四:action查询今天是星期几
    1.修改nlm.yml添加意图-intent:ask_dayexamples:|-今天是星期几?-今天星期几?-现在是星期几?2.修改domain.ymlintents里面增加intents:-ask_day actions里面增加actions:-action_get_day 3.修改rules.yml-rule:respondtoday......
  • 【python基础】repr函数
     描述repr()函数将对象转化为供解释器读取的形式。语法以下是repr()方法的语法:repr(object)参数object--对象。返回值返回一个对象的string格式。实例#coding=UTF-8s="物品\t单价\t数量\n包子\t1\t2"print(s)print(repr(s))output:物品单价......
  • 必备Python代码
    Python是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的Python语法已经有一些了解,那么这篇文章可能会给你一些启发。1.重复元素判定以下方法可以检查给定列表是不是存在重复元素,它会使用set()函数来移除所有重复元素。defall_unique(lst):......
  • Python3 函数
    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的......