• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

데코레이터 함수 및 동작시간 질문입니다.~

23.01.29 15:17 작성 조회수 185

1

남박사님 안녕하세요~. 수업 재밌게 듣고 있습니다.

아래 코드의 클로져에 대한 내용은 이해했습니다.

import time
def time_checker(func):
    def inner_function(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(type(result))
        print("함수 {} 동작시간 {}".format(func.__name__, end_time-start_time))
        return result
    return inner_function

def test1():
    for i in range(5):
        time.sleep(0.1)

f = time_checker(test1)
f()

1. f= time_checker(test1)

time_checker 실행하여 f에 inner_function 리턴 후, result에 test1()의 값(None) 담음

2.f()

inner_function 실행하여 print() 및 test1()의 값 리턴


문제는 데코레이터 부분인데, 로직에 대한 제 생각이 맞는지 질문드립니다.

@time_checker # test1 = time_checker(test1)
def test1():
    for i in range(5):
        time.sleep(0.1)

test1()

1.@time_checker [ #test1 = time_checker(test1) ]

test1 = time_checker(test1) -->time_checker 실행하여 test1에 inner_function 리턴 후, result에 test1()의 값(None) 담음

2.test1()

test1()이 곧 inner_function()이므로 print() 및 test1()의 값 리턴

3.헷갈리는 점

이제 test1()이 inner_function이 되었고, test1() 정의 아래의 func도 test1()이니 충돌이 나지 않나요?

    def inner_function(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(type(result))
        print("함수 {} 동작시간 {}".format(func.__name__, end_time-start_time))
        return result

P.S 저의 경우 time_checker의 동작 시간이 0.54초로 오차가 너무 큽니다. 컴퓨터 사양의 문제일까요,,?

답변 2

·

답변을 작성해보세요.

1

이제 test1()이 inner_function이 되었고, test1() 정의 아래의 func도 test1()이니 충돌이 나지 않나요?

test1이 timer_checker의 func 인자로 넘어갔고 test1 함수가 확장이 된 개념이기 때문에 test1()이 inner_function이 된 게 아닙니다. 그러므로 확장된 함수의 인자로 func에 test1가 담기게 되고 func()를 호출함으로써 확장된 함수의 test1 함수가 호출되는 역할을 하게 됩니다.

물론 이 모든 행위는 test1()을 호출하는 순간 동작하며 호출 되기 전까지는 메모리에 정의만 된 상태로 유지되게 됩니다. 이렇게 함수를 메모리에 확장하여 보관해놓는게 클로저의 핵심적인 내용이라 보시면 됩니다.

 

0

유대겸님의 프로필

유대겸

질문자

2023.02.13

감사합니다ㅎㅎ