파이썬 제너레이터와 yield

사용자들이 직접 작성하는 실전팁!

Moderator: Dry8r3aD

Post Reply
User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/04 Wed 12:19 pm

카카오 개발자 박승규님의 2019년 파이썬 개발자 대회에서 발표한 자료의 슬라이드를 보고 감명받아서 적어봅니다.

Code: Select all

# -*- coding: utf-8 -*-

s1 = "파이썬"
s2 = "우분투"
def f():
    yield "수아는 " + s1 + "을 공부합니다."
    yield "규리는 " + s2 + "를 좋아합니다."

g = f()

print(type(g))
print(next(g))
print(next(g))
제너레이터는 함수안에 return 대신 yield 를 포함시키면 만들 수 있다고 합니다.
그리고
이해하기가 쉽지않습니다 문법의 깊이가 저세상 난이도입니다...
한번에 이해가 안되기에... 반복적으로 하루에 한번씩 쳐다봅니다...
한 삼천번만 읽고 쓰고 읽고 쓰고를 반복하다보면 언젠가는 이해가 될거라 생각하고
지금 무쟈게 참고문헌을 찾아서 읽어재끼고 있는중입니다...

### 참고문헌:
[1] https://github.com/wapj/pyconkr2019tutorial (박승규님의 발표 자료)
[2] https://wikidocs.net/16069 (위키독스 개념 설명)
[3] http://occamsrazr.net/tt/78 (관련 용어 개념에 대한 심도있는 분석 -- 반복자에 관한)

[크롬OS 에서 작성했씁니다]
[크롬OS 에서 내용을 매끄럽게 수정 및 보완했습니다]
[우분투 18.04 파여폭스 나비에서 여러차례 예제 코드를 고쳤습니다]
Attachments
스크린샷, 2019-09-05 05-02-13.png
수아-규리는 파이썬과 우분투를 좋아합니다^^^
스크린샷, 2019-09-05 05-02-13.png (382.97 KiB) Viewed 464 times
Screenshot 2019-09-04 at 12.15.31 PM.png
메모리의 효율성을 극대화시키려면 제너레이터와 함께 춤을~^^^
Screenshot 2019-09-04 at 12.15.31 PM.png (465.73 KiB) Viewed 535 times
Last edited by 황병희 on 2019/09/05 Thu 5:06 am, edited 13 times in total.
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/04 Wed 3:22 pm

Code: Select all

# -*- coding: utf-8 -*-
# 우분투 한국 대화방 서니님의 도움 코드: 20190530

import sys
import time

def spinning_cursor():
    while True:
        for cursor in '|/-\\':
            yield cursor

spinner = spinning_cursor()
for _ in range(31):
    sys.stdout.write(next(spinner))
    sys.stdout.flush()
    time.sleep(0.3)
    sys.stdout.write('\b')

# 편집: Emacs 26.2 (Ubuntu 18.04)
마이클잭슨의 춤사위(3)를 보면 춤동작이 참 힘이있고 아름답다라는 느낌이 오는데,,,
가다 서다 가다 서다를 반복함에 한번씩 '멈춤'이 그 비결이라는걸 어데서 읽은거 같아요.
그 적재적소의 '멈춤' 덕분에 춤을 예술의 경지로 승화시키는!
파이썬의 'yield' 에서 춤사위에서의 '멈춤' 처럼 그런 느낌을 받습니다...

파이썬 코드를 예술로 만들어주는 마법의 단어
yield
오늘은 yield 의 그 느낌만 간직한채 참고문헌 읽는걸 멈출까해요,,,

### 참고문헌 ###
(1) 구글: "yield 활용"
(2) 아기와 yield (모두의공원): https://www.clien.net/service/board/park/12595395
(3) 마이클잭슨 1999년 내한공연: 서울 잠실 올림픽주경기장 [1999-06-25]

[우분투 파여폭스 나비에서 작성했씁니다]
[우분투 파여폭스 나비에서 추가 참고문헌을 적었습니다]
[크롬OS 에서 주석을 보강했씁니다]
Attachments
yield와볏짚.jpg
소에게 볏짚을 줄때 yield 의 원리를 알면 볏짚을 절약할 수 있으며 소의 배꾸레(배통)도 원하는만큼 키울 수 있습니다!!! yield 의 감사함^^^
yield와볏짚.jpg (52.94 KiB) Viewed 516 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/06 Fri 12:52 pm

소를 봐야 소 가격 흥정을 할 수 있듯... yield 가 어데 쓰이는 물건인지를 봐야 좀 더 동기부여가 되지 않을까요.. 해서 찾아봤습니다.
대한민국 리눅스 사용자에겐 필수 항목인 입력기 프로젝트 ibus 에서요. libhangul/ibus-hangul 소스코드에선 yield 가 발견되지 않았습니다...

ibus 소스코드를 git clone 해서 find/xargs/grep 로 찾아보니 딱 4군데서 yield 를 쓰고 있었습니다.
실제 프로젝트에서 어떻게 쓰이느냐는 엄청 중요합니다. 이보다 더 큰 동기부여가 있을까요?
ibusWayland 도 지원합니다. 아주 중요한 요소입니다. 리눅스/오픈소스 사용자들에게 Wayland 는 곧 미래이며 희망입니다.

ibus 소스코드를 통해서 전 yield 가 무엇인지를 그리고 어떻게 쓰이는지를 두눈으로 확인하고자 합니다. 정말 간절합니다.

꾸벅,,,

### 참고문헌 및 주석 ###
(1) ibus: https://en.wikipedia.org/wiki/Intelligent_Input_Bus (위키백과 영문)
(2) ibus 핵심 인물:
- Peng Huang (원작자) <penghuang@chromium.org>: 구글 크롬 프로젝트에서 활동중
- Takao Fujiwara (안정판 출시 책임자) <fujiwara@fedoraproject.org>: 레드햇에서 근무중 + 그놈 애호가
- 최환진 (한글 입출력 책임개발자) <choe.hwanjin@gmail.com>: 그저 고맙고 감사한 분^^^
(3) Wayland: https://en.wikipedia.org/wiki/Wayland_( ... _protocol) (위키백과 영문)

[크롬북 우분투 18.04 파여폭스 나비에서 작성했씁니다]
[크롬북 우분투 18.04 파여폭스 나비에서 내용을 보강했습니다]
Attachments
스크린샷, 2019-09-06 12-41-28.png
그놈/Wayland 채고채고! ibus 만세만세!! 리눅스 만만세!!!
스크린샷, 2019-09-06 12-41-28.png (246.99 KiB) Viewed 430 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/08 Sun 12:20 pm

한글 입력이 쉽지 않음을 다들 알고계십니다. 그래서 libhangul 의 위대함... 감사함이 다시금 새겨집니다.. 한글을 한자 한자 자판으로 입력할때마다 전 느낍니다. 지금은 나비로 한글을 입력중입니다. 정확히 두벌식 옛글 모드로 설정을 해둔 상태입니다.

하지만 때가 가까운 미래는 Wayland 시대이므로.. 나비에서 ibus-hangul(Wayland 지원함) 로 갈아탈 준비를 하고 있습니다.
데비안 11 (Bullseye) 이 출시될즈음 어느정도 Wayland 가 안정화되지 않을까 생각합니다. 2년 정도 남았어요.
그때까진 이 나비를 딸래미 아끼듯 애지중지 소중히 다뤄보고 싶어요. 이제 2년정도 남았기에,,,

nabi 소스코드에서도 yield 는 발견되지 않았씁니다.
ibus [2] 소스코드가 yield 공부자료로 확정되는 순간입니다.

소의 볏짚이 yield 와 무슨 상관이 있길래 첫글에 사진으로 첨부했느냐...
실무(농사꾼의 실무를 말함)에서도 yield 방식의 활용으로 덕을 보고 있습니다.

소에겐 볏짚이 소화제입니다.
사료를 먹어도 볏짚을 안먹어주면 그 먹은 사료를 소화를 못시키며,
다음 끼니때 사료를 더 못먹습니다. 배(위)가 아파오는 까닭입니다...
그래서 소에겐 볏짚이 정말 중요합니다. 마치 물과 물고기의 관계처럼요,,,

볏짚을 줄때에 두가지 방식이 있습니다.
첫번째, 한덩어리(원형으로 생긴 뭉치-- 대략 300~400kg) 자체를 소여물통에다 놓고 소가 그 볏짚을 먹어치워서 다 떨어질때마다 다시 채워주는 방식입니니다.
이를 무제한급여라고 합니다. 먹고싶을때 아무때나 원하는만큼 먹을수 있기에 소들은 좋아할지라도,
필요이상으로 먹어치우므로 볏짚이 많이 소요됩니다. 창고에 비축해둔 볏짚이 빨리 동납니다...

두번째, 이게 yield 방식입니다. 끼니때에 딱 소에게 필요한 만큼의 볏짚을 소여물통에 공급해주는 방식입니다. 농장주가 일거리가 좀 늘어나는 단점이 있지만,
필요이상으로 소모되는 볏짚을 절약할 수 있는 장점이 있습니다. 그래서 원가절감위하야 이렇게 yield 방식으로 소를 키우는 농가가 늘어나고 있습니다.
볏짚도 돈을 주고 사야하는 농가는 진짜 와닿는 방식입니다. 저도 최근 yield 방식으로 볏짚을 급여중입니다.

제 자신이 비전공자라 콤푸타의 한 개념을 이해하기빡센고로 문과적인 개념을 끌어다와서 콤푸타의 yield 개념을 보충하였습니다.

이제 갑니다. 진짜 yield 를 파이썬적으로 요약한 문서를 발견했어요. 박연오님의 yield 설명입니다. [1]
박연오 wrote: 이 절의 내용은 약간은 이해하기 어려울 수도 있다. 여러 번 읽어봐도 이해가 되지 않는다면 ...
진짜로 쉽지않습니다...;;;

[1] 반복자와 생성기(제너레이터) 그리고 yield: https://python.bakyeono.net/chapter-7-4.html
[2] ibus 공식 소스코드 저장소: https://github.com/ibus/ibus

[우분투 18.04 파여폭스 나비에서 작성했씁니다]
[크롬OS 에서 내용을 좀 더 매끄럽게 고쳤습니다]
Attachments
스크린샷, 2019-09-08 13-00-01.png
yield 개념은 다시 코루틴과 연결됩니다 갈수록 태산입니다 ㅠㅠㅠ
스크린샷, 2019-09-08 13-00-01.png (298.69 KiB) Viewed 350 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/15 Sun 11:46 am

코루틴은 대략 협업의 개념 같아요...

실무에서 볏짚작업할때 트랙터 두대(+두명)가 출격합니다.
한대는 집초기를 매고, 다른 한대엔 결속기를 매달고 들판에 함께 나갑니다.
볏짚작업을 대략 파이썬 함수(제너레이터)로 그림을 그려봤어요~
(문과적 상상속에서 그린 함수라서 결함이 존재합니다. 개념파악차원에서만 봐주세요~^^^)

Code: Select all

def 볏짚작업():
    while True:
        yield 집초() # 볏짚작업시 집초작업을 먼저함
        yield 결속() # 집초작업 끝나자마자 결속작업 수행함

가을걷이 = 볏짚작업()

for 마지기 in range(100): # 100마지기의 들판
    next(가을걷이) # 100마지기 다할때까지 볏짚작업() 반복수행.
yield 위치에 return 을 삽입해도 수행은 되지만,,, return 을 삽입하면 트랙터 기름값이 많이 들어가며 시간도 많이 소요됩니다.

# 참고문헌 및 주석: 볏짚작업 사진 추가 (들판에서 집초작업중인 트랙터)
사진출처: http://blog.daum.net/_blog/BlogTypeView ... 0906233143
Image

[크롬OS 에서 작성했씁니다]
[우분투 18.04 파여폭스 나비에서 오타 수정했습니다]
Attachments
20180807_092916.jpg
가을걷이 끝난 볏짚단을 소에게 급여중인 모습 (출처: 대숲농장)
20180807_092916.jpg (7.73 MiB) Viewed 246 times
20181202_153300.jpg
트랙터 후미에 매단 결속기 모습 (출처: 소여물의 트랙터)
20181202_153300.jpg (9.19 MiB) Viewed 254 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/19 Thu 9:16 pm

yield 링크를 타고 타고 가다보니... 비동기/동기와 만나더이다...

부득이하게,
트랙터 1대가 작업할때 마지기마다 집초작업/결속작업을 같이하면서 100마지기를 해나가는것이 [동기방식]이요,
해당 트랙터에 집초기 달아서 100마지기 전체를 집초작업만을 먼저 빠르게 해치우고나서,
다시 결속기로 옮겨매달고서 결속작업으로 마무리 해나가는게 [비동기방식]입니다.
(잠시 문과적 상상을 끌어들여 개념을 보충합니다)

비동기가 빠릅니다. 동기는 꼼꼼합니다. 둘 다 일장일단이 있습니다.
실무에선 비가 간헐적으로 오지않는한은 대부분 비동기방식으로 볏짚작업을 해나갑니다.
빠르거등요, 그리고 비동기방식으로 하면 시간도 절약하며 인건비/기계대여비도 적게 듭니다.

과거 저의 경험입니다.
FreeBSD 4.x 시절에 파일시스템이 UFS 였는데..
파일 하나 압축을 해제하거나 다른 파티션으로 복사할때 리눅스 파일시스템에 비하여 시간이 좀 걸렸습니다.
그래서 FreeBSD 5.x 에서 UFS2 라는 파일시스템이 생겼습니다. 좀 빨라졌더라구요...
설치시에 파티션분할을 자동모드로 해두면 5.x 에서 루트(/) 는 UFS 그리고 /home 파티션류는 UFS2 로 할당하더이다.
지금 깨달은 사실이지만, 큰틀에서 봤을때 UFS 는 [동기방식], UFS2 는 [비동기방식] 이었습니다.

다시 볏짚작업으로 돌아와서, 2대의 트랙터로 작업하더라도 말이죠,,,
각각의 트랙터 1대가 집초작업과 결속작업을 같이 해나가면 그게 심지어 10대라 하더라도 시간이 많이 걸리며 인건비/기계대여비 엄청 들어갑니다.
1마지기할때마다 집초기 달았다가 결속기 옮겨달았다를 수없이 반복해야하기에,,, 기계 옮겨매다느라 시간을 많이 잡아먹는까닭입니다.
솔직히 사람 힘도 많이 들어갑니다,,, 기계 옮겨매다는게 진짜 빡셉니다...;;;
동기방식이 비동기방식에 비해 속도가 안나오는 근원적 배경입니다.

비동기방식으로 하면 1대는 집초작업만 쭈우욱 해나가고 뒤따라가면서
나머지 한대가 결속작업만 해나가면 인건비/기계대여비도 아끼고 전체작업시간을 앞당길 수 있습니다.

결론: 비동기방식생산성 향상에 좋습니다^^^

[크롬OS 에서 작성했씁니다]
Attachments
K0050117001_1.jpg
볏짚작업 모습 (출처: 경북대구한우협동조합 홈페이지)
K0050117001_1.jpg (41.02 KiB) Viewed 177 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/20 Fri 10:35 am

실무에선 비가 간헐적으로 오지않는한은
다음날 또는 오후 늦게 비가 오게되면 100마지기 전체 작업이 불가능합니다.
그래서 20마지기 정도만 집초작업하고서 바로 그 20마지기만 결속작업완료후 모든 볏짚작업을 종료시킵니다.
나머지 80마지기는 비가 그치고 며칠정도 들판을 햇볕에 말린후에
작업 재개합니다.

만약 비를 무시하고
100마지기 전체다 집초작업 해놓으면 80마지기는 비에 젖은채로 결속해야하는데,
비에 젖은 볏짚을 결속해놓으면 내부에서 볏짚이 썩어들어가고 그 볏짚은 소가 먹질 못합니다.
비가 오는 날은 볏짚작업이 불가능한 이유였습니다. 다른표현으로 비오는 날을 앞두고선 비동기방식을 쓸 수가 없습니다.

재부팅 시점에서 더이상 다른 작업을 벌이지 않고 (하던작업을 모두 정상종료시킨 후) sync; sync; sync; 를 여러번 쉘(슈퍼유저)에서 입력하고서,
콤푸타[FreeBSD 4.x 이하]를 재부팅(reboot) 또는 전원을내리는(shutdown) 이치가 위의 비올때의 볏짚작업 상황이랑 비슷합니다.

### 주석: sync(8) -- FreeBSD
URL: https://www.freebsd.org/cgi/man.cgi?que ... &sektion=8

[우분투 18.04 파여폭스 나비에서 작성했습니다]
[크롬OS 에서 내용 보완했습니다]
Attachments
스크린샷, 2019-09-20 11-33-36.png
yield 문법이 저세상 난이도였던 까닭: '비동기 프로그래밍' ;;;
스크린샷, 2019-09-20 11-33-36.png (260.22 KiB) Viewed 126 times
64aa91c3489e56033016ab9f75c0af1c.jpg
결속작업까지 되어있는 볏짚단은 비를 맞아도 썩지않으며 99.9%가 안전하게 보전됩니다 (사진출처: ihanwoo.org)
64aa91c3489e56033016ab9f75c0af1c.jpg (190.75 KiB) Viewed 140 times
^고맙습니다 감사합니다_^))//

User avatar
황병희
Posts: 714
Joined: 2009/10/18 Sun 1:47 am
Contact:

Re: 파이썬 제너레이터와 yield

Post by 황병희 » 2019/09/21 Sat 11:01 am

잠시 쉬어갑니다.

위에서 우리가 입력기 나비에서 ibus(한글: ibus-hangul) 로 갈아탈 수 밖에 없는 이유가 Wayland 였습니다.
이 Wayland 가 아직은 안 와닿는건 여전히 많은 리눅스 배포판들이 Xorg 위에서 돌아가는중이며,
원체 밑바닥에서 돌아가는거라 관련 개발자외엔 신경쓸 필요가 없기때문입니다.
그래서 일반사용자 수준에선 웹브라우저 바꾸듯 쉽게 교체해가며 테스트 하기 힘든 영역입니다.

그 침묵을 깨고 데비안이 10번째판 부스타에서 먼저 시도를 했어요. 기본 윈도를 Xorg 에서 Wayland 로 바꾸었습니다.
모질라 프로젝트에서도 어떤 준비를 하고 있을거라 생각합니다. 웹브라우저플젝중 가장 오픈소스 친화적인 곳이니깐요.

그리고 혹시라는 마음에 찾아보니 크롬프로젝트에서도 2018년(사실 더 이전)부터 꾸준히 준비를 해왔던 정황을 방금 발견했씁니다.

Xorg 를 탈피하고 Wayland 위에서 크롬OS 나 크롬브라우저가 돌아가게끔하는 준비를 해왔던겁니다.
Xorg 에서 Wayland 로 넘어가는건 거의 개벽수준입니다. 어마어마합니다...

데비안 11번째판 Bullseye 가 출시될때에나 Wayland 가 좀 안정화되지 않을까 생각합니다.
(좀 더 정확히 Wayland 를 지원하는 응용프로그램들이 많이 생길거라는 의미)

https://github.com/Igalia/chromium/tree ... ayland-dev (Wayland 이식 실험 및 작업 공간 -- 외부저장소[BRANCH])
https://bugs.chromium.org/p/chromium/is ... ?id=578890 (크롬플젝 본진에서의 Wayland 작업현황 -- 버그와의 빡센 전투중)

태그: Wayland, 리눅스, Chromium

[크롬OS 에서 작성했씁니다]
Attachments
Screenshot 2019-09-21 at 10.42.32 AM.png
크롬플젝의 Wayland 이식 계획 발표 -- 2018년
Screenshot 2019-09-21 at 10.42.32 AM.png (663.34 KiB) Viewed 90 times
^고맙습니다 감사합니다_^))//

Post Reply