Python - 用装饰器测量函数执行时间
Python - measure function execution time with decorator
我有下一个问题:
例如,我有一个名为 my_pow 的函数(这只是一个简单的例子),它有两个参数和 return a^b,它看起来像这样:
def my_pow(a, b):
res = a ** b
return res
# or just return a ** b, it doesn't really matter
而且我有一个装饰器,它应该测量装饰函数执行了多长时间 运行。
def decorator_timer(some_function):
from time import time
def wrapper(*args, **kwargs):
t1 = time()
result = some_function(*args, **kwargs)
return result, time()-t1
return wrapper
问题是,我无法真正测量函数计算所花费的时间,例如 99999 ** 99999。我可以计算它并打印 res,这样我就可以得到正确的执行时间,但是 None 将从 my_pow() 函数 returned,或者我可以 return res,但是 运行 花费的时间将是 0.0001,虽然明显装饰函数是 运行ning 更长的时间,实际上大约 3 秒。有没有一种方法可以测量运行那个函数花了多长时间,同时return一个函数的res值?
您的函数 是 运行 在 0.0001 秒内。但是由于数字太大,打印它几乎需要 3 秒。所以你的代码正在运行, I/O(print) 只是很慢。只打印花费的时间就可以自己看。
为了进一步证明这一点并添加 emil 的评论
def decorator_timer(some_function):
from time import time
def wrapper(*args, **kwargs):
t1 = time()
result = some_function(*args, **kwargs)
end = time()-t1
return result, end
return wrapper
@decorator_timer
def my_pow(a, b):
res = a ** b
return res
# or just return a ** b, it doesn't really matter
result, exec_time = my_pow(99999 , 99999)
print(exec_time) # prints after 0.07347989082336426 seconds
print(result) # takes ~3 seconds
我有下一个问题: 例如,我有一个名为 my_pow 的函数(这只是一个简单的例子),它有两个参数和 return a^b,它看起来像这样:
def my_pow(a, b):
res = a ** b
return res
# or just return a ** b, it doesn't really matter
而且我有一个装饰器,它应该测量装饰函数执行了多长时间 运行。
def decorator_timer(some_function):
from time import time
def wrapper(*args, **kwargs):
t1 = time()
result = some_function(*args, **kwargs)
return result, time()-t1
return wrapper
问题是,我无法真正测量函数计算所花费的时间,例如 99999 ** 99999。我可以计算它并打印 res,这样我就可以得到正确的执行时间,但是 None 将从 my_pow() 函数 returned,或者我可以 return res,但是 运行 花费的时间将是 0.0001,虽然明显装饰函数是 运行ning 更长的时间,实际上大约 3 秒。有没有一种方法可以测量运行那个函数花了多长时间,同时return一个函数的res值?
您的函数 是 运行 在 0.0001 秒内。但是由于数字太大,打印它几乎需要 3 秒。所以你的代码正在运行, I/O(print) 只是很慢。只打印花费的时间就可以自己看。
为了进一步证明这一点并添加 emil 的评论
def decorator_timer(some_function):
from time import time
def wrapper(*args, **kwargs):
t1 = time()
result = some_function(*args, **kwargs)
end = time()-t1
return result, end
return wrapper
@decorator_timer
def my_pow(a, b):
res = a ** b
return res
# or just return a ** b, it doesn't really matter
result, exec_time = my_pow(99999 , 99999)
print(exec_time) # prints after 0.07347989082336426 seconds
print(result) # takes ~3 seconds