Python functools.reduce: 복잡한 집계를 간단하게 만드는 매직

Python의 functools.reduce는 리스트와 같은 반복 가능한 객체에서 연속적인 집계 작업을 수행할 때 유용합니다. 이름 그대로, 데이터를 "줄이는(reduce)" 과정에서 사용됩니다. 복잡한 계산이나 집계를 간단한 코드로 구현할 수 있지만, 잘 사용하지 않으면 읽기 어려운 코드가 될 수 있어요.

이 글에서는 reduce의 기본 개념을 설명하고, 특히 실제 코드에서 유용하게 적용할 수 있는 예제를 통해 이를 활용하는 방법을 소개하겠습니다. 데이터 집계, 딥러닝 모델 학습 중 데이터 전처리 등에서 유용하게 사용할 수 있는 사례를 중심으로 작성했습니다.


functools.reduce란?

reduce는 Python의 functools 모듈에 포함된 함수로, 리스트나 튜플과 같은 반복 가능한 객체의 요소를 두 개씩 묶어 연산을 수행하며 데이터를 집계하는 데 사용됩니다. reduce를 사용하면 데이터를 축약하는 과정을 간결하고 효율적으로 표현할 수 있습니다.


1. reduce 기본 사용법

reduce는 세 가지 요소를 필요로 합니다:

  1. 함수: 두 개의 인자를 받아 처리하는 함수
  2. 반복 가능한 객체: 리스트나 튜플 등
  3. 초기값 (선택사항): 집계를 시작할 초기값

기본적인 예제로 리스트의 합을 구하는 코드를 작성해보겠습니다.

from functools import reduce

# 리스트 합 계산
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x + y, numbers)

print("합계:", result)

결과

합계: 15

설명

  • lambda x, y: x + y: 두 값을 더하는 익명 함수.
  • reduce는 처음 두 값을 더하고, 결과를 다음 요소와 다시 더하는 과정을 반복합니다.
  • 최종적으로 리스트의 모든 값이 더해져 결과가 반환됩니다.

2. reduce로 복잡한 집계를 단순화하기

reduce는 리스트의 합이나 곱뿐 아니라, 복잡한 집계 작업도 간단히 구현할 수 있습니다. 예를 들어, 최댓값을 구하는 코드입니다.

from functools import reduce

# 최댓값 구하기
numbers = [7, 3, 5, 8, 2, 9]
max_value = reduce(lambda x, y: x if x > y else y, numbers)

print("최댓값:", max_value)

결과

최댓값: 9

설명

  • lambda x, y: x if x > y else y: 두 값을 비교해 더 큰 값을 반환하는 함수.
  • reduce는 리스트의 처음 두 값을 비교하고, 더 큰 값을 다음 요소와 다시 비교하며 최종적으로 최댓값을 반환합니다.

3. 딥러닝 데이터 전처리에 적용: 레이어 크기 계산

딥러닝 모델을 설계할 때, 네트워크의 전체 파라미터 수를 계산해야 할 때가 있습니다. 각 레이어의 크기를 리스트로 저장한 뒤, 이를 reduce를 사용해 곱해보겠습니다.

from functools import reduce

# 각 레이어의 크기
layer_sizes = [784, 128, 64, 10]  # 입력층(784), 히든층(128, 64), 출력층(10)

# 전체 파라미터 수 계산
total_params = reduce(lambda x, y: x * y, layer_sizes)

print("전체 파라미터 수:", total_params)

결과

전체 파라미터 수: 64225280

설명

  • lambda x, y: x * y: 두 값을 곱하는 익명 함수.
  • reduce는 각 레이어의 크기를 차례로 곱해 최종적으로 네트워크의 총 파라미터 수를 계산합니다.
  • 복잡한 계산식도 단 한 줄로 간단히 표현할 수 있습니다.

4. 여러 딕셔너리 합치기

reduce는 리스트에 있는 여러 딕셔너리를 하나로 병합할 때도 유용합니다. 딕셔너리를 단순히 합칠 뿐 아니라 중복된 키를 처리하거나 값을 누적시키는 작업도 가능합니다.

from functools import reduce

# 여러 딕셔너리
dicts = [
    {"a": 1, "b": 2},
    {"b": 3, "c": 4},
    {"c": 5, "d": 6}
]

# 딕셔너리 병합
merged_dict = reduce(lambda x, y: {**x, **y}, dicts)

print("병합된 딕셔너리:", merged_dict)

결과

병합된 딕셔너리: {'a': 1, 'b': 3, 'c': 5, 'd': 6}

설명

  • {x, y}: 딕셔너리 xy를 병합. 중복된 키가 있으면 y의 값으로 덮어씁니다.
  • reduce를 사용하면 여러 딕셔너리를 효율적으로 합칠 수 있습니다.

5. 텍스트 데이터 처리: 문자열 합치기

문자열 리스트를 연결할 때 reduce를 사용하면 효율적이고 깔끔한 코드를 작성할 수 있습니다.

from functools import reduce

# 텍스트 데이터
words = ["Deep", "Learning", "is", "awesome!"]

# 문자열 연결
sentence = reduce(lambda x, y: x + " " + y, words)

print("문장:", sentence)

결과

문장: Deep Learning is awesome!

설명

  • lambda x, y: x + " " + y: 두 문자열을 공백으로 연결하는 함수.
  • reduce는 리스트의 각 문자열을 순서대로 연결하여 최종 문장을 만듭니다.

reduce가 주는 이점

  1. 코드 단순화: 반복문 없이도 데이터를 집계하는 복잡한 과정을 간단히 구현할 수 있습니다.
  2. 유연성: 수치 데이터, 문자열, 딕셔너리 등 다양한 데이터 유형에 적용 가능합니다.
  3. 효율성: 데이터를 한 번만 순회하며 작업을 처리하므로 빠르고 간결한 코드 작성이 가능합니다.

요약: functools.reduce로 집계를 간단히!

Python의 functools.reduce는 반복 가능한 데이터를 단일 값으로 집계하는 작업을 간단하게 만듭니다. 데이터 분석, 딥러닝 전처리, 문자열 처리 등 다양한 작업에서 효율적으로 활용할 수 있습니다.

reduce는 특히 다음과 같은 경우 유용합니다:

  1. 리스트의 합, 곱, 최댓값/최솟값 등 수치 집계 작업.
  2. 딕셔너리를 병합하거나 누적 처리해야 할 때.
  3. 텍스트 데이터를 연결하거나 변환할 때.
  4. 딥러닝 모델 설계 시 레이어 크기 계산.

+ Recent posts