Functools
Functools module은 high-order-function(고차원 함수)를 위해 고안된 것으로 다른 함수에 적용하거나 다른 함수를 반환하는 모듈이다. Functools에는 다음과 같은 함수들을 제공한다.
- lru_cached
- cmp_to_key
- total_ordering
- partial
- reduce
1. lru_cached
@functools.lru_cache(maxsize = 128 )
lru_cache(user_function)
lru_cache는 함수의 리턴 결과를 캐시해 주는 데코레이터이며, 최종 요청 이후에는 캐시된 결과를 리턴한다. maxsize는 캐시할 수 있는 최대 갯수를 의미하며, Least Recently Used(LRU)를 사용하기 때문에 최근에 참고되지 않은 데이터가 교체된다.
다음과 같이 재귀를 사용해서 factorial을 구하는 함수가 있다고 하자.
Jupyter의 timeit 매직함수를 사용해서 n이 10일 때, 20일 때 시간을 측정해보도록 한다.
이번에는 functools의 lru_cahce를 데코레이터로 설정해서 factorial을 재정의하고, 다시 한 번 10, 20일 때 시간을 측정해보도록 한다.
내부적으로 각 factorial의 값을 캐시하고 있기 때문에, 시간 단축이 많이 발생한 것을 알 수 있다.
2. cmp_to_key
sorted와 같은 정렬 함수의 key에 함수로 정렬을 하기 위해서 사용한다. 이 때 사용하는 함수는 두 개의 인수를 받아야 하고, 그들을 비교해서 작다면 음수, 같으면 0, 크다면 양수를 반환하도록 해야 한다.
예시는 다음 문제를 사용하도록 한다.
https://codedrive.tistory.com/429
3. total_ordering
@total_ordering 데코레이터를 사용하면, 사용자 정의 객체, 즉 class끼리 비교하거나 정렬할 수 있다. 다음 블로그 글이 잘 설명하고 있는 것 같아 참조한다.
https://velog.io/@doondoony/Python-total-ordering-decorator
4. partial
partial은 한 함수의 특정 인자를 위한 함수를 만들기 위해 사용한다. 숫자나 문자열을 정수(integer)로 변환해주는 파이썬 내장 함수 int(x, base=10)을 재활용하여, 이진수로만 변환해주는 새로운 함수를 만들 수 있다.
기존에 int 내장 함수는 위와 같이 작동한다. partial을 사용해서 각 진수로 변환할 수 있는 새 함수를 정의하도록 한다.
이처럼 partial은 여러 인자를 받는 함수를 하나의 인자를 고정시켜서 새로운 함수로 정의하고자 할 때, 사용한다.
5. reduce
reduce는 반복가능한 객체(iterable)에 함수를 순차적으로 적용한다. 단, 각각의 객체에 적용하는 것이 아닌 누적형식으로 적용한다.
즉 위 예시는 15 = (((1+2)+3)+4+5) 와 같은 방식으로 적용되어 계산된 것과 같다.
Reference
https://docs.python.org/ko/3/library/functools.html
'Language > Python' 카테고리의 다른 글
[Python] collections 모듈 (0) | 2021.09.17 |
---|---|
[Python 따라하기]10. 내장함수와 외장함수(filter,map,random) (0) | 2019.04.02 |
[Python 따라하기]9.예외처리(try,except,finally) (0) | 2019.03.26 |
[Python 따라하기]8.클래스와 상속(Class, inheritance) (2) | 2019.03.19 |
[Python 따라하기]7.파일 입출력 (File I/O) (0) | 2019.03.12 |