파이썬(Python) Generator- 설명
파이썬에서 성능 및 효율적으로 코드를 작성 하기 위해서 제네레이터 패턴을 많이 사용합니다.
제네레이터는 간단하게 설명하면 배열이나 리스트와 같은 반복가능한 연속적인 값들을 생성해 내는 패턴이고
가장 중요한 점은 모든 값을 포함하여 반환 하는 대신 호출 할 때마다 한 개의 값을 리턴하는 것입니다.
그런 이유에서 아주 작은 메모리로 효율적으로 대용량의 반복가능한 구조를 순회할 수 있다는 것이 가장 큰
장점이라고 볼 수 있습니다.
문서 하단에서 간단한 예제를 통해서 제네레이터를 쉽게 알아보도록 하겠습니다.
Python 관련 포스팅 : Python 관련
Python 관련 포스팅 : Python 관련
파이썬(Python) Generator - 다이어그램
아래와 다이어그램으로 나타낼 수 있으며, 관련 예제는 하단에서 설명합니다.
Generator & Iterator 패턴 구조 - 출처
파이썬(Python) Generator - 예제 코드
파이썬 제네레이터를 구현한 2개의 예제 파일입니다.
Generator1.py
123456789101112131415161718192021222324252627282930313233343536373839 #Generator 예제1 #리스트 생성def square_numbers1(nums): result = [] for i in nums: result.append(i * i) return result my_nums1 = square_numbers1([1, 2, 3, 4, 5]) #타입 확인print(type(my_nums1))#리스트 출력print(my_nums1)#합계print(sum(my_nums1)) #제네레이터 생성def square_numbers2(nums): for i in nums: yield i * i my_nums2 = square_numbers2([1, 2, 3, 4, 5]) #타입 확인print(type(my_nums2))#제네레이터 출력print (my_nums2)#합계#print(sum(my_nums2)) print (next(my_nums2))print (next(my_nums2))print (next(my_nums2))print (next(my_nums2))print (next(my_nums2))#print (next(my_nums2)) #주석 해제 시 StopIteration 예외 발생 cs
- 3번 ~ 10번 라인 : 함수로 리스트를 생성해서 반환
- 21번 ~ 25번 라인 : yield를 사용한 제네레이터 반환 - 28번 라인 : type 함수로 Generator 타입 확인- 39번 라인 : 주석 해제 시 StopIteration 예외 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #Generator 예제1 #리스트 생성 def square_numbers1(nums): result = [] for i in nums: result.append(i * i) return result my_nums1 = square_numbers1([1, 2, 3, 4, 5]) #타입 확인 print(type(my_nums1)) #리스트 출력 print(my_nums1) #합계 print(sum(my_nums1)) #제네레이터 생성 def square_numbers2(nums): for i in nums: yield i * i my_nums2 = square_numbers2([1, 2, 3, 4, 5]) #타입 확인 print(type(my_nums2)) #제네레이터 출력 print (my_nums2) #합계 #print(sum(my_nums2)) print (next(my_nums2)) print (next(my_nums2)) print (next(my_nums2)) print (next(my_nums2)) print (next(my_nums2)) #print (next(my_nums2)) #주석 해제 시 StopIteration 예외 발생 | cs |
- 3번 ~ 10번 라인 : 함수로 리스트를 생성해서 반환
- 21번 ~ 25번 라인 : yield를 사용한 제네레이터 반환
Generator2.py
Generator2.py
1234567891011121314151617181920212223242526272829 #Generator 예제2 #list comprehension 사용 리스트 생성my_nums3 = [x for x in [1, 2, 3, 4, 5]] #타입 확인print (type(my_nums3))#for문 사용 출력for i in my_nums3: print (i) #List comprehension 사용 제네레이터 생성my_nums4 = (x for x in [1, 2, 3, 4, 5])#my_nums4 = [x for x in [1, 2, 3, 4, 5]] #리스트 생성 #타입 확인print (type(my_nums4))#리스트 변환 출력#print(list(my_nums4)) #제네레이터 출력print (next(my_nums4))print (next(my_nums4))print (next(my_nums4))print (next(my_nums4))print (next(my_nums4))#print (next(my_nums4)) #주석 해제 시 StopIteration 예외 발생 cs
- 4번 라인 : list comprehension으로 리스트 생성
- 7번 라인 : 기존 for문을 활용한 리스트 순회 및 출력- 14번 라인 : list comprehension으로 제네레이터 생성
- 19번 라인 : type 함수로 Generator 타입 확인- 29번 라인 : 주석 해제 시 StopIteration 예외 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #Generator 예제2 #list comprehension 사용 리스트 생성 my_nums3 = [x for x in [1, 2, 3, 4, 5]] #타입 확인 print (type(my_nums3)) #for문 사용 출력 for i in my_nums3: print (i) #List comprehension 사용 제네레이터 생성 my_nums4 = (x for x in [1, 2, 3, 4, 5]) #my_nums4 = [x for x in [1, 2, 3, 4, 5]] #리스트 생성 #타입 확인 print (type(my_nums4)) #리스트 변환 출력 #print(list(my_nums4)) #제네레이터 출력 print (next(my_nums4)) print (next(my_nums4)) print (next(my_nums4)) print (next(my_nums4)) print (next(my_nums4)) #print (next(my_nums4)) #주석 해제 시 StopIteration 예외 발생 | cs |
- 4번 라인 : list comprehension으로 리스트 생성
- 7번 라인 : 기존 for문을 활용한 리스트 순회 및 출력
- 19번 라인 : type 함수로 Generator 타입 확인
Python Generator 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
Python Generator 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) Generator - 예제 실행 화면
아래 두 개의 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면1
실제 실행 화면2
마무리
제네레이터를 사용한 성능 측정 등에 관한 자료를 찾아보면서 압도적인 벤치마크 결과에 관심을 가지고 함수
동작 원리를 생각해 보면서 포스팅을 하게 되었습니다.
좋은 퍼포먼스와 메모리 리소스를 절감할 수 있는 제네레이터 패턴은 파이썬을 활용한 데이터과학 분야에서
데이터 흐름에 따라 프로그램을 작성할 수 있는 장점을 제공한다고 볼 수 있습니다.
다음시간에는 파이썬 멀티프로세싱에 대해서 포스팅 하도록 하겠습니다.
소스코드 다운로드 :
python_generator.zip
'언어 > Python' 카테고리의 다른 글
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(2) - 동기화 (0) | 2018.05.09 |
---|---|
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(1) - 기초 (1) | 2018.05.06 |
파이썬(Python) - 이터레이터(Iterator) 설명 및 예제 소스 코드 (0) | 2018.04.27 |
파이썬 Youtube(유투브) 동영상 다운로드 및 MP3 자동 변환 예제 소스 (32) | 2017.12.22 |
파이썬 아나콘다(Anaconda) - 텐서플로우(TensorFlow) 설치 및 실행 (12) | 2017.12.15 |