让我们假设一个简单的方法:
def test_method():
a = 1
b = 10000
c = 20000
sum1 = sum(range(a,b))
sum2 = sum(range(b,c))
return (sum1,sum2)
要使用装饰器计时此方法,一个简单的装饰器将是:
from functools import wraps
def timed_decorator(f):
@wraps(f)
def wrapper(*args, **kwds):
start = time.time()
result = f(*args, **kwds)
elapsed = (time.time() - start)*1000
logger.debug("f::{0} t::{1:0.2f} ms".format(f.__name__, elapsed))
return result
return wrapper
现在,如果我想对特定行进行计时test_method
说第4行sum1 = sum(range(a,b))
,当前的实现涉及内联编码,例如:
def test_method():
a = 1
b = 10000
c = 20000
start = time.time()
sum1 = sum(range(a,b)) # timing specific line or lines
elapsed = (time.time() - start)*1000
logger.debug("This part took::{1:0.2f} ms".format(elapsed))
sum2 = sum(range(b,c))
return (sum1,sum2)
目的是使用装饰器对特定方法的 M 到 N 行进行时间安排,而不修改方法中的代码。
是否可以使用装饰器注入这样的逻辑?
您可以使用上下文管理器。
import contextlib
@contextlib.contextmanager
def time_measure(ident):
tstart = time.time()
yield
elapsed = time.time() - tstart
logger.debug("{0}: {1} ms".format(ident, elapsed))
在您的代码中,您可以像这样使用它
with time_measure('test_method:sum1'):
sum1 = sum(range(a, b))
顺便说一句,如果你想改进你的代码,你可以使用高斯求和公式(解释here) 代替sum(range(a, b))
.
def sum_range(a, b):
r_a = (a ** 2 + a) / 2 - a
r_b = (b ** 2 + b) / 2 - b
return r_b - r_a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)