이 코드는 파이썬 데코레이터의 대표적인 사용 예로, 함수의 실행 시간을 측정하는 데코레이터를 직접 구현한 것입니다.
# decorator.py
import time
def elapsed(original_func): # 기존 함수를 인수로 받는다.
def wrapper():
start = time.time()
result = original_func() # 기존 함수를 수행한다.
end = time.time()
print("함수 수행시간: %f 초" % (end - start)) # 기존 함수의 수행시간을 출력한다.
return result # 기존 함수의 수행 결과를 리턴한다.
return wrapper
@elapsed
def myfunc():
print("함수가 실행됩니다.")
# decorated_myfunc = elapsed(myfunc) # @elapsed 데코레이터로 인해 불필요한 코드
# decorated_myfunc()
myfunc()
🔍 코드 설명
1. elapsed
함수 (데코레이터 함수)
def elapsed(original_func):
original_func
: 데코레이터가 감쌀 대상 함수입니다 (myfunc
).
2. 내부 함수 wrapper()
def wrapper():
start = time.time() # 시작 시간 측정
result = original_func() # 원래 함수 실행
end = time.time() # 끝 시간 측정
print("함수 수행시간: %f 초" % (end - start)) # 실행 시간 출력
return result # 원래 함수의 결과 반환
wrapper()
는 클로저로original_func
를 기억하고, 감싸서 실행하는 역할을 합니다.
3. 데코레이터 적용
@elapsed
def myfunc():
print("함수가 실행됩니다.")
- 이 줄은 다음과 동일합니다:
myfunc = elapsed(myfunc)
4. 실행
myfunc()
- 실제로 실행되는 함수는
wrapper()
입니다.
- 하지만
wrapper()
안에서original_func()
가 호출되므로myfunc
본래 기능도 실행됩니다.
🧠 결과 예시
함수가 실행됩니다.
함수 수행시간: 0.000012 초
✅ 요약
구분 | 설명 |
@elapsed | myfunc 을 elapsed(myfunc) 으로 감쌈 |
wrapper() | 시간 측정 + 원래 함수 실행 |
myfunc() 호출 | 실제로는 wrapper() 실행됨 |
Share article