繁体   English   中英

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

[英]python - How to define function that I can use efficiently across modules and directories

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

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

选项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. timed是一个“装饰器”,它将方法包装在python对象中并对该方法进行timed
  2. 该类包含一个由@timed方法调用时包装程序更新的log

请注意,如果您想使@property充当“类属性”,则可以从本文中汲取灵感。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM