데코레이트

장점

단점

데코레이터 미사용 (클로저로 사용해보기)

# 데코레이터

import time

# 클로저 형태로 사용함..
def performance_clock(func):
    def perf_clocked(*args):
        # 함수 시작 시간
        st = time.perf_counter()
        # 함수 실행
        result = func(*args)
        # 함수 종료 시간
        et = time.perf_counter() - st
        # 실행 함수 명
        name = func.__name__
        # 함수 매개변수
        arg_str = ', '.join(repr(arg) for arg in args)
        print('[%0.5fs] %s(%s) -> %r' % (et, name, arg_str, result))
        return result
    return perf_clocked

def time_func(seconds):
    time.sleep(seconds)

def sum_func(*numbers):
    return sum(numbers)

# 데코레이터를 미사용
none_deco1 = performance_clock(time_func)
none_deco2 = performance_clock(sum_func)

print(none_deco1, none_deco1.__code__.co_freevars)
print(none_deco2, none_deco2.__code__.co_freevars)

print('-' * 40, 'Called None Decorator -> time_func')
none_deco1(1.5)
print('-' * 40, 'Called None Decorator -> time_func')
none_deco2(100, 200, 300, 400, 500)

데코레이터 사용

@performance_clock
def time_func2(seconds):
    time.sleep(seconds)

@performance_clock
def sum_func2(*numbers):
    return sum(numbers)

none_deco3 = performance_clock(time_func2)
none_deco4 = performance_clock(sum_func2)

print('-' * 40, 'Called Decorator -> time_func')
none_deco3(1.5)
print('-' * 40, 'Called Decorator -> sum_func')
none_deco4(100, 200, 300, 400, 500)