일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- UDF
- 제로샷
- AI 동화
- 파이썬
- 파라미터 힌트
- 도커
- 대스크
- Python
- dask
- Cognitive Search
- 아기동화
- 동화책
- Docker
- 인자 힌트
- 반복문
- Compute
- GPT
- 토끼
- 모험
- Redshift
- FOR
- 검색
- 프롬프트 튜닝
- Ai
- 조건문
- 인컨텍스트 러닝
- Azure
- 퓨샷
- Cognitive Service
- 컨텍스트 매니져
- Today
- Total
호랭이 분석가
코드 실행 시간 측정하기 Decorator (Context Manager) 본문
1. Decorator (데코레이터)
Decorator는 다른 함수를 장식하거나 수정하는 함수입니다.
Decorator는 함수를 인자로 받아서 새로운 함수를 반환합니다.
이를 사용하면 코드를 재사용하고, 로직을 캡슐화하고
기존 함수를 수정하지 않고도 행동을 추가하거나 변경할 수 있습니다.
Decorator를 통해서 함수의 실행 시간을 측정해 보도록 하겠습니다.
def timer(func) :
def wrapper(*args, **kwargs) :
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
elapsed_time = end_time - start_time
td = timedelta(seconds=elapsed_time)
print(f"{func.__name__} 함수의 실행 시간 : {str(td)}초")
return result
return wrapper
위 코드는 함수를 인자로 받아서
주어진 함수의 실행 시간을 측정하고 그 시간을 출력하는 함수입니다.
result = func(*args, **kwargs)를 통해
원래 함수가 받는 모든 인자를 포착하여 사용하기 때문에
모든 함수에 적용하여 사용 가능합니다.
예제 코드로 실행 시간을 측정해보도록 하겠습니다.
@timer
def sum(x, y):
return x + y
sum(10, 100)
sum 함수 작성시 @를 통해 decorator를 적용할 수 있습니다.
이를 통해 10과 100을 더하는 sum 함수를 실행 시 위와 같이 시간을 측정할 수 있습니다.
2. Context Manager
Context Manager는 with를 사용하는 코드 블럭에서 사용 가능한 객체입니다.
with 코드는 해당 블럭에 들어가기 전과 나오기 후에 어떠한 작업을 실행하게 합니다.
파일을 열거나, 데이터베이스 트랜잭션을 시작하거나,
임시적으로 로깅 레벨을 변경하는 등의 작업을 하게 됩니다.
Context Manager를 이용하여 코드의 실행 시간을 측정하는 코드를 동일하게 작성해 보겠습니다.
import time
from contextlib import contextmanager
from datetime import datetime, timedelta
@contextmanager
def timer(name):
start_time = time.time()
yield
end_time = time.time()
elapsed_time = end_time - start_time
td = timedelta(seconds=elapsed_time)
print(f"{name} 실행 시간 : {str(td)}초")
contextlib을 이용하여 함수를 작성합니다.
일반 Decorator를 작성할 때와는 다르게
yield가 사용되는데, 이를 이용하여
with 불록 내에서 실행할 수 있는 코드를 입력할 수 있도록 합니다.
yield 아래에 오는 코드가 실행되기 전에 실행됩니다.
with timer('계산') :
x = 1
y = 2
print(x+y)
위의 Decorator 예제와는 다른 결과를 얻었는데요,
yield에서 print(x+y)까지 코드가 실행되기 때문에
실행 시간이 출력되기 전 x+y의 값이 먼저 출력됩니다.
이를 통해 함수가 아닌 단일 코드에 대한 실행 시간도 측정할 수 있습니다.
'Python' 카테고리의 다른 글
파이썬 함수 작성시 데이터 타입 힌트 활용하기 (0) | 2023.07.28 |
---|---|
리스트 컴프리헨션과 조건문 (list comprehension and if-else) (0) | 2023.07.25 |
[Bot] #3. Class 봇 생성하기 (0) | 2022.10.24 |
[Bot] #2. 봇을 만들기 위한 Webhook URL 생성 - 구글챗 (0) | 2022.10.24 |
[Bot] #1. 봇을 만들기 위한 Webhook URL 생성 - 슬랙 (0) | 2022.09.29 |