在调试程序时,经常需要知道程序运行的时长,最长见的方法是在程序开始时加上:
oldtime = time.time()
在程序末尾,加上:
print(time.time() - oldtime)
但这样在程序完成时,就需要将这些语句删除。在网上学习了装饰器的用法,觉得用装饰器可以完美解决这个问题。运行原理可参考:python装饰器详解
代码如下:
import time
# 自定义装饰器函数
def runtime(func):
'''
这是装饰器函数,参数 func 是被装饰的函数
返回程序执行的时间,主要用于调试
在需要提示的程序上一行写: @runtime'''
def wrapper(*args, **kw):
oldtime = time.time()
# 真正执行的是这行
func(*args, **kw)
print(f'程序 {func.__name__} 运行时间:{time.time()-oldtime}秒')
return wrapper
说明:在需要运行的程序上边,加上 @runtime 就行,程序运行后会显示 函数名称 及其运行时长。
例子:
import time
# 自定义装饰器函数
def runtime(func):
'''
这是装饰器函数,参数 func 是被装饰的函数
返回程序执行的时间,主要用于调试
在需要提示的程序上一行写: @runtime'''
def wrapper(*args, **kw):
oldtime = time.time()
# 真正执行的是这行
func(*args, **kw)
print(f'程序 {func.__name__} 运行时间:{time.time()-oldtime}秒')
return wrapper
@runtime
def 程序a():
# 运行n次
n = 0
while n < 10000000:
n += 1
@runtime
def 程序b():
time.sleep(3) # 暂停3秒
程序a()
程序b()
运行结果:
但这种方法在调试结束后,仍然需要一行行地删除或注释掉 @runtime 这行代码哦。当然,如果程序不是太大且不太关注程序运行效率,又经常需要在调试状态和运行状态切换的话,可以加一个全局变量开关,标识程序是否在调试状态,在调试状态下装饰器输出内容,其它状态不输出即可。