Python을 배워보자

Python의 yield 키워드를 활용한 효율적인 데이터 처리

_Blue_Sky_ 2024. 12. 25. 21:57
728x90
728x90

 

Python에서 yield 키워드는 특별한 기능을 제공하여 프로그래머에게 강력한 도구를 제공합니다. yield는 함수를 특별한 종류의 이터레이터로 만들어주는데, 이를 제너레이터라고 합니다. 제너레이터는 필요한 순간에 값을 생성하고 반환하는 특징을 가지고 있어, 메모리 효율성이 뛰어나고 다양한 데이터 처리 방식을 가능하게 합니다.

1. yield의 개념과 동작 원리

yield는 함수 내에서 호출될 때마다 값을 반환하고, 다음 호출 시 이전에 중단된 지점부터 실행을 재개하는 역할을 합니다. 이는 마치 함수가 여러 번 호출되는 것처럼 보이지만, 실제로는 함수의 상태가 유지되면서 필요한 값만 생성하는 것입니다.

제너레이터와 일반 함수의 차이점:

  • 메모리 효율성: 제너레이터는 모든 값을 한꺼번에 메모리에 할당하지 않고, 필요한 순간에 값을 생성하기 때문에 메모리 사용량을 줄일 수 있습니다.
  • 지연 평가: 값이 실제로 필요한 순간까지 계산을 미루므로, 무한한 데이터 스트림이나 복잡한 계산을 처리하는 데 유용합니다.
  • 이터레이터 프로토콜: 제너레이터는 이터레이터 프로토콜을 따르므로 for 루프나 in 연산자와 함께 사용할 수 있습니다.

 

728x90

2. 다양한 예시를 통한 이해

2.1 무한 수열 생성기

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

위 코드는 0부터 무한대로 증가하는 숫자를 생성하는 무한 수열을 만들어냅니다. while True 루프를 통해 무한히 반복하며, yield를 통해 각 숫자를 하나씩 반환합니다. 이를 통해 메모리 걱정 없이 무한한 수열을 다룰 수 있습니다.

2.2 파일에서 한 줄씩 읽어오기

def read_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield line.strip()

큰 파일을 처리할 때, 한 번에 모든 내용을 메모리에 로드하는 대신 yield를 사용하여 필요한 부분만 읽어올 수 있습니다. 이는 메모리 효율성을 높이고, 대용량 파일 처리 시 발생할 수 있는 메모리 부족 문제를 해결하는 데 도움이 됩니다.

2.3 피보나치 수열 생성기

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

피보나치 수열은 이전 두 항의 합으로 다음 항을 계산하는 특징을 가지고 있습니다. yield를 사용하여 각 항을 생성하고 반환함으로써 메모리 효율적으로 피보나치 수열을 생성할 수 있습니다.

2.4 이진 트리 순회

def inorder_traverse(node):
    if node:
        yield from inorder_traverse(node.left)
        yield node.value
        yield from inorder_traverse(node.right)

이진 트리를 중위 순회하는 예시입니다. yield from을 사용하여 재귀적으로 트리를 순회하며, 각 노드의 값을 순서대로 반환합니다.

3. yield의 활용 분야

  • 무한 스트림 처리: 무한한 데이터 스트림을 효율적으로 처리할 수 있습니다.
  • 큰 파일 처리: 큰 파일을 작은 조각으로 나누어 처리할 수 있습니다.
  • 코루틴: 비동기 프로그래밍에서 코루틴을 구현하는 데 사용됩니다.
  • 데이터 생성: 임의의 데이터를 생성하는 데 사용될 수 있습니다.
  • 함수형 프로그래밍: 함수형 프로그래밍 스타일의 코드를 작성하는 데 유용합니다.

4. yield와 return의 차이점

  • return: 함수를 종료하고 값을 반환합니다.
  • yield: 함수를 일시 정지하고 값을 반환하며, 다음 호출 시 이전에 중단된 부분부터 다시 실행합니다.

 

728x90

yield 키워드는 Python에서 메모리 효율적인 데이터 처리를 위한 강력한 도구입니다. 무한 스트림, 큰 파일 처리, 코루틴 등 다양한 분야에서 활용될 수 있으며, 함수형 프로그래밍 스타일과도 잘 어울립니다. yield를 이해하고 활용하면 더욱 효율적이고 우아한 Python 코드를 작성할 수 있습니다.

728x90
728x90