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 |