背景
我们在 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() 函数分别计算了两个方法执行开始和结的时间戳,然后做减法计算其运行时间。代码的打印效果如下:
事实上,这种计算某一个方法的执行时间的需求,往往都是临时性的需求。这种需要记录方法执行前后时间,再做减法计算时间差的做法,反而显得有些繁琐。
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】,秒表装饰器即可以打印被装饰的方法的运行时间信息,清晰明了,效果如下:
我们观察到,秒表装饰器详细的记录并打印了两个方法的执行时间信息,其中包括了以下内容:
- 被测试的方法的名称 方
- 法开始执行的时间
- 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
小结
以上就是给大家分享的 DebugInfo 模块中的一个 秒表 装饰器的用法,可以协助优化具体的算法性能。
Pyinstrument
如果大家需要总体审查代码的性能瓶径,Pyinstrument 是更合适的工具哈。
标签:python,方法,最终,DebugInfo,time,秒表,装饰 From: https://blog.51cto.com/u_16227127/7127457