실행 시간을 측정하는 Python 데코레이터

Python decorator series 에 대한 이전 기사에서 데코레이터의 작동 방식과 간단한 함수 기반 데코레이터 및 클래스 기반 데코레이터와 매개변수를 지원하는 데코레이터를 구현하는 방법을 배웠습니다. 이 기사에서는 재사용 가능한 데코레이터 유틸리티를 만들어 클래스의 함수 및 인스턴스 메서드의 실행 시간을 측정합니다.

함수의 실행 시간 측정




from functools import wraps
import time


def timeit(func):
    @wraps(func)
    def timeit_wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        total_time = end_time - start_time
        print(f'Function {func.__name__}{args} {kwargs} Took {total_time:.4f} seconds')
        return result
    return timeit_wrapper


@timeit
def calculate_something(num):
    """
    Simple function that returns sum of all numbers up to the square of num.
    """
    total = sum((x for x in range(0, num**2)))
    return total

if __name__ == '__main__':
    calculate_something(10)
    calculate_something(100)
    calculate_something(1000)
    calculate_something(5000)
    calculate_something(10000)



작동 원리


  • timeit 데코레이터로 함수를 장식합니다
  • .
  • 데코레이터가 시작 시간을 기록함
  • 그런 다음 함수
  • 를 실행합니다.
  • 데코레이터 표시 종료 시간
  • 은 시차를 계산하고 함수
  • 에 소요된 시간을 인쇄합니다.

    산출

    Function calculate_something(10,) {} Took 0.0000 seconds
    Function calculate_something(100,) {} Took 0.0008 seconds
    Function calculate_something(1000,) {} Took 0.0760 seconds
    Function calculate_something(5000,) {} Took 2.4503 seconds
    Function calculate_something(10000,) {} Took 7.9202 seconds
    


    클래스 내 메서드의 실행 시간 측정




    from functools import wraps
    import time
    
    
    def timeit(func):
        @wraps(func)
        def timeit_wrapper(*args, **kwargs):
            start_time = time.perf_counter()
            result = func(*args, **kwargs)
            end_time = time.perf_counter()
            total_time = end_time - start_time
            # first item in the args, ie `args[0]` is `self`
            print(f'Function {func.__name__}{args} {kwargs} Took {total_time:.4f} seconds')
            return result
        return timeit_wrapper
    
    
    class Calculator:
        @timeit
        def calculate_something(self, num):
            """
            an example function that returns sum of all numbers up to the square of num
            """
            total = sum((x for x in range(0, num**2)))
            return total
    
        def __repr__(self):
            return f'calc_object:{id(self)}'
    
    
    if __name__ == '__main__':
        calc = Calculator()
        calc.calculate_something(10)
        calc.calculate_something(100)
        calc.calculate_something(1000)
        calc.calculate_something(5000)
        calc.calculate_something(10000)
    
    


    작동 원리


  • timeit을 사용하여 클래스 내부의 메서드를 장식합니다
  • .
  • timeit은 모든 인수를 사용합니다. args[0]은 self이므로 self
  • 를 사용하여 클래스 내에서 다른 메서드를 호출할 수 있습니다.
  • 데코레이터가 시작 시간을 기록함
  • 그런 다음 함수
  • 를 실행합니다.
  • 데코레이터 표시 종료 시간
  • 은 시차를 계산하고 함수
  • 에 소요된 시간을 인쇄합니다.

    산출

    Function calculate_something(calc_object:140246512997904, 10) {} Took 0.0000 seconds
    Function calculate_something(calc_object:140246512997904, 100) {} Took 0.0007 seconds
    Function calculate_something(calc_object:140246512997904, 1000) {} Took 0.1820 seconds
    Function calculate_something(calc_object:140246512997904, 5000) {} Took 1.9241 seconds
    Function calculate_something(calc_object:140246512997904, 10000) {} Took 7.4005 seconds
    


    다음 글에서는 다양한 종류의 데코레이터 레시피를 구현해 보겠습니다. 다가오는 기사를 계속 지켜봐주십시오. 뉴스레터를 구독하고 내 향후 기사를 받으려면 나와 연결하십시오.

    좋은 웹페이지 즐겨찾기