>

코드 블록을 실행하는 데 걸리는 시간을 측정하기 위해 타이머를 구현하고 싶습니다. 그런 다음 여러 디렉토리 (4+)에서 여러 모듈 (40+)을 포함하는 전체 응용 프로그램 에서이 작업을 수행하려고합니다.

타이머는 다음과 같은 구조를 가진 클래스 내에있는 두 개의 함수로 만들어집니다 :

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

    OPTION 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 ...
    
    

    OPTION 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 ...
    
    

  • 답변 # 2

    당신이 무엇을 찾고 있는지 잘 모르겠지만, 옛날에는 비슷한 유형의 문제에 데코레이터를 사용했습니다.

    아래 스 니펫은 당시 구현 한 내용과 가장 비슷합니다. 희망이 당신에게 유용합니다.

    간단한 설명 <올>

    와이즈 비즈  파이썬 객체의 메소드를 감싸고 메소드를 곱한 '장식 자'입니다.

    클래스에 timed 가 포함되어 있습니다  래퍼에 의해 log 로 업데이트됩니다.  메소드가 호출됩니다.

    당신이 @timed 를 만들고 싶다면  이 게시물에서 영감을 얻을 수있는 "클래스 속성"역할을합니다.

    @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)

관련 자료

  • 이전 프롤로그 호출 가능 예상 정수 오류
  • 다음 git clone - 힘내 메타 데이터 - 각 브랜치와 독립적 인 git 메타 데이터를 추가하는 방법이 있습니까?