Functools

Functools module은 high-order-function(고차원 함수)를 위해 고안된 것으로 다른 함수에 적용하거나 다른 함수를 반환하는 모듈이다. Functools에는 다음과 같은 함수들을 제공한다.

  1. lru_cached
  2. cmp_to_key
  3. total_ordering
  4. partial
  5. 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

 

[BOJ]1422. 숫자의 신

문제: 숫자의 신은 여러명이 있지만, 그 중에 자연수의 신은 오세준이다. 오세준은 자연수의 신으로 오래오래 살다가 어느 날 음수의 신과 전쟁을 하게 되었다. 오세준은 음수의 신 이다솜을 이

codedrive.tistory.com

3. total_ordering

@total_ordering 데코레이터를 사용하면, 사용자 정의 객체, 즉 class끼리 비교하거나 정렬할 수 있다. 다음 블로그 글이 잘 설명하고 있는 것 같아 참조한다.

https://velog.io/@doondoony/Python-total-ordering-decorator

 

[Python] functools.total_ordering

@total_ordering 과 Python 비교연산자 오버로딩에 대해 알아보아요

velog.io

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

 

functools — 고차 함수와 콜러블 객체에 대한 연산 — Python 3.9.6 문서

 

docs.python.org

 

+ Recent posts