반응형
파이썬 데코레이터 간편 설명¶
- 함수의 실행 전후에 추가적인 코드를 실행하거나, 인자를 조작하거나, 함수의 결과를 가공하는 등의 작업을 수행할 수 있습니다
- [필요지식] 파이썬 함수는 함수를 입력값으로 받을 수 있습니다.
In [1]:
# 데코레이터 함수 선언
def deco(func):
# "result is" 와 같이 반복적인 내용을 가진 wrapper 선언
def wrapper(*args, **kwargs):
# 반복적인 내용 추가
string = "result is "
# 데코레이터를 이용할 함수 결과 반환
result = func(*args, **kwargs)
return string + str(result)
return wrapper
데코레이터 활용 예시 1¶
In [2]:
# @ 뒤에 함수를 데코레이터 함수를 작성하고 아래 새로운 함수를 작성합니다.
# 데코레이터가 없을 때
def plus(a, b):
return a+b
result = plus(1,2)
print(result)
3
In [3]:
# 데코레이터가 있을 때
@deco
def plus(a, b):
return a+b
result = plus(1,2)
print(result)
result is 3
데코레이터 활용 예시 2¶
In [4]:
# 정수 및 소수로 구성된 리스트를 어레이로 변환하고 어레이의 shape를 안내하는 딕셔너리를 제작하고자 합니다
# 예를 들어
# [1, 2, 3] 을
# {'shape': (3,), 'value': array([1, 2, 3])} 와 같이 반환 합니다.
import numpy as np
def array_fix(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
# 새로운 함수를 통과한 결과가 리스트이면 계속 진행합니다.
if type(result) is list:
# 리스트를 어레이로 변환합니다.
result = np.array(result)
# 어레이의 shape을 확인합니다.
result2 = result.shape
# shape와 어레이 값을 딕셔니리 형태로 반환합니다.
dic = {"shape" : result2,
"value" : result}
else:
print("list please")
return dic
return wrapper
In [5]:
# 예시 1
@array_fix
def test1(a):
return a
li = [1, 2, 3]
result = test1(li)
print(result)
{'shape': (3,), 'value': array([1, 2, 3])}
In [6]:
# 예시 2
@array_fix
def list_plus(a, b):
return a+b
li1 = [1, 2, 3]
li2 = [4, 5, 6]
result = list_plus(li1, li2)
print(result)
{'shape': (6,), 'value': array([1, 2, 3, 4, 5, 6])}
데코레이터 활용 예시 3¶
- @tf.function은 위 예시처럼 확연히 눈에 보이진 않지만, 아래와 같은 기능을 수행합니다.
속도 향상
TensorFlow 그래프는 실행 속도가 빠르며, 특히 반복적인 작업에서 성능 향상을 가져올 수 있습니다.메모리 최적화
그래프는 계산을 최적화하고 중간 계산 결과를 메모리에서 관리하여 메모리 사용량을 줄일 수 있습니다.분산 실행
그래프 모드로 변환된 함수는 분산 환경에서 실행될 준비가 되어 있어 분산 학습 및 실행에 용이합니다.GPU 및 TPU 활용
그래프는 하드웨어 가속기인 GPU나 TPU와 함께 사용될 때 효과적인 성능을 발휘할 수 있습니다.
In [9]:
import tensorflow as tf
import warnings
warnings.filterwarnings(action='ignore')
@tf.function
def test_step(y, yhat):
loss = y-yhat
return loss
In [10]:
x = tf.constant([2, 3])
y = tf.constant([3, -2])
loss = test_step(x, y)
print(loss)
tf.Tensor([-1 5], shape=(2,), dtype=int32)
반응형
'python' 카테고리의 다른 글
딕셔너리 값이 최대값인 키 도출 (파이썬) (0) | 2023.08.19 |
---|---|
파이토치 데이터 셔플 ranperm (0) | 2023.08.19 |
파이썬 객체 슬라이싱 기능 구현 __getitem__ 특별메소드 (0) | 2023.08.18 |
argparser를 활용한 True False 반환 하기 (0) | 2023.08.18 |
파이썬 정규식 성능 향상을 위한 compile 객체 사용법 (0) | 2023.08.18 |
댓글