python-如何定义可以在模块和目录之间有效使用的函数

时间:2018-08-10 22:33:36

标签: python function class

我想实现一个计时器来测量代码块运行所需的时间。然后,我想在包含多个模块(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保护下的代码内部使用计时器(在该处定义了该计时器(我的应用程序无法呈现,并且在我的应用程序中出现“找不到页面”错误)浏览器)。但是我想在全球所有应用程序模块中的任何地方使用此代码。模块是否在另一个目录中,是否某些代码块在其他模块中的其他类和子类中,无处不在。

最简单,最有效的方法是创建此计时工具,以便我可以在应用程序中的任何地方使用它?我知道我可能必须完全不同地定义它。我对所有这些都非常陌生,因此感谢您的帮助。

2 个答案:

答案 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)

我不确定您要寻找的是什么,但是很久以前,我曾使用装饰器解决类似问题。

下面的代码段是我记得当时最接近的代码段。希望它对您有用。

简要说明

  1. timed是一个“装饰器”,将方法包装在python对象中并对该方法进行计时。
  2. 该类包含一个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)