我想实现一个计时器来测量代码块运行所需的时间。然后,我想在包含多个模块(40+)和多个目录(4+)的整个应用程序中执行此操作。
我的计时器是由具有以下结构的类中的两个函数创建的:
class SubClass(Class1)
def getStartTime(self):
start = time.time()
return start
def logTiming(self, classstring, start):
fin = time.time() - start
logging.getLogger('perf_log_handler').info((classstring + ' sec').format(round(fin,3)))
第一个函数获取开始时间,第二个函数计算块运行的时间,然后将其记录到记录器中。
此代码位于我们称为module1.py的模块中。
实际上,通常会这样实现:
class SubSubClass(SubClass)
def Some_Process
stim = super().getStartTime()
code..............................
...
...
...
...
super().logTiming("The Process took: {}", stim)
return Result_Of_Process
此代码驻留在名为module2.py的模块中,并且已经可以正常工作并成功记录日志。我的问题是,当采用这种结构时,我似乎只能在SubClass保护下的代码内部使用计时器(在该处定义了该计时器(我的应用程序无法呈现,并且在我的应用程序中出现“找不到页面”错误)浏览器)。但是我想在全球所有应用程序模块中的任何地方使用此代码。模块是否在另一个目录中,是否某些代码块在其他模块中的其他类和子类中,无处不在。
最简单,最有效的方法是创建此计时工具,以便我可以在应用程序中的任何地方使用它?我知道我可能必须完全不同地定义它。我对所有这些都非常陌生,因此感谢您的帮助。
答案 0 :(得分:0)
选项1 ),您应该定义另一个模块,例如完全专用于计时器的“ mytimer.py”:
import time
class MyTimer():
def __init__(self):
self.start = time.time()
def log(self):
now = time.time()
return now - self.start
然后,从代码的任何一行,例如在module2.py中:
from mytimer import MyTimer
class SomeClass()
def Some_Function
t = MyTimer()
....
t.log()
return ...
选项2 ),您也可以使用简单的函数代替类:
import time
def mytimer(start=None, tag=""):
if start is None:
start = time.time()
now = time.time()
delay = float(now - start)
print "%(tag)s %(delay).2f seconds." % {'tag': tag, 'delay': delay}
return now
然后,在您的代码中:
from mytimer import mytimer
class SomeClass()
def Some_Function
t = mytimer(tag='BREAK0')
....
t = mytimer(start=t, tag='BREAK1')
....
t = mytimer(start=t, tag='BREAK2')
....
t = mytimer(start=t, tag='BREAK3')
return ...
答案 1 :(得分:0)
我不确定您要寻找的是什么,但是很久以前,我曾使用装饰器解决类似问题。
下面的代码段是我记得当时最接近的代码段。希望它对您有用。
timed
是一个“装饰器”,将方法包装在python对象中并对该方法进行计时。log
,包装器会在调用@timed
方法时对其进行更新。请注意,如果您想使@property
充当“类属性”,则可以从this帖子中汲取灵感。
from time import sleep, time
# -----------------
# Define Decorators
# ------------------
def timed(wrapped):
def wrapper(self, *arg, **kwargs):
start = time()
res = wrapped(self, *arg, **kwargs)
stop = time()
self.log = {'method': wrapped.__name__, 'called': start, 'elapsed': stop - start}
return res
return wrapper
# -----------------
# Define Classes
# ------------------
class Test(object):
__log = []
@property
def log(self):
return self.__log
@log.setter
def log(self, kwargs):
self.__log.append(kwargs)
@timed
def test(self):
print("Running timed method")
sleep(2)
@timed
def test2(self, a, b=2):
print("Running another timed method")
sleep(2)
return a+b
# ::::::::::::::::::
if __name__ == '__main__':
t = Test()
res = t.test()
res = t.test2(1)
print(t.log)