프로그래밍/파이썬

[Python] yield 키워드

고등어찌짐 2022. 6. 24. 10:01

append 보다 빠르게 yield!

개발 중 json 데이터를 특정 리스트의 형식으로 붙여야하는 상황이 생겼다. 평소라면 append 를 사용했겠지만 데이터 양이 너무 많아서 시간을 단축해야 했다. 그러던 중 저번에 클린 코드 책에서 본 yield 를 이용한 append 대체 방식이 문득 생각나서 적용해보았고, 더 빠른 결과를 얻을 수 있었다. 이참에 yield 에 대해 한번 정리해보기.

 


iterable 과 generator

yield 를 이애하기 전 알아야 하는 2가지 개념 : iterable 과 generator

  • iterable
    반복 가능한 객체 ( list, dict, set, tuple, ragne, ... )
    모든 값들을 메모리에 저장함
  >>> temp = [x for x in range(3)]
  >>> for i in temp:
  ...    print(i)
  0
  1
  2
  • generator 
    한 번 사용하면 사라지는 값
    계산된 값들은 메모리에 저장되지 않음
    아래 예제에서, temp 에 대해 for 문을 2번 이상 반복해서 사용할 수 없다는 의미
  >>> temp = (x for x in range(3))
  >>> for i in temp:
  ...    print(i)
  0
  1
  2

 


yield 란 ? 

  • yield 란 return 처럼 생겼지만 generator 값을 반환하는 것
  • 딱 한번만 사용해도 되는 values set 을 반환
  • 아래 코드에서 yield_test 함수 내의 for 문을, 반복 루프를 돌면서 yield 를 만나면 값을 반환하는 방식으로 작동
def yield_test():
  temp = range(3)
  for i in temp:
  	yield i

myield = yield_test() 
print(myield) 
for i in myield:
	print(i)
    
# results
0
1
2

 


yield 와 append 뭐가 더 빠를까?

  • yield 를 사용해 리스트 원소를 붙이는 예제 코드 
data = range(1000)

  def my_yielder():
      def yielder():
          for d in data:
              yield d
      return list(yielder())

  def my_append():
      mylist = []
      for d in data:
          mylist.append(d)
      return mylist

 

  • timeit 으로 측정한 실행 속도
`my_yielder()` : 10000 loops, best of 5: 57.8 µs per loop
`my_append()` : 10000 loops, best of 5: 79.2 µs per loop

yield 가 훨씬 빠르다 !

 



 

# 참조
https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
https://stackoverflow.com/questions/3487802/which-is-generally-faster-a-yield-or-an-append

'프로그래밍 > 파이썬' 카테고리의 다른 글

[Python] 데코레이터 ( decorator )  (0) 2022.07.19
[Python] 추상 클래스  (0) 2022.04.18
[Python] 클래스를 사용해야하는 이유  (0) 2022.04.13