0
点赞
收藏
分享

微信扫一扫

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

背景

我们在 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 秒表装饰器_Python

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

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 秒表装饰器_Python_03

小结

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

Pyinstrument

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

举报

相关推荐

0 条评论