#누가더, #빠른가?, #좋은가?
케바케?
실제로 돌려보면...
알 수 있지...
금방...
앞서 Generator 를 사용하는 이유 중 하나가
'메모리 뻑' 이었는데,
실제로 확인을 좀 해보면,
function 1
try:
%load_ext memory_profiler
except Exception:
%reload_ext memory_profiler
# 쥬피터 쓰시면 위에 먼저 진행.. 혹시 에러면 pip 로 필요한거 설치..
function 2
def double_loop_gen(arr):
for row_loc, row_value in enumerate(arr):
for col_loc, col_value in enumerate(row_value):
yield (row_loc, col_loc), col_value
function 3
def double_loop_no_gen(arr):
res = []
for row_loc, row_value in enumerate(arr):
for col_loc, col_value in enumerate(row_value):
res.append(((row_loc, col_loc), col_value))
return res
딱 봐도,
차이가 그냥 보이는데,
yield vs. res<list>
가볍게 5000000 길이의 배열 3개를 중첩한 데이터를 가지고,
test 1
arr = [list(range(5000000)), list(range(5000000)), list(range(5000000))]
%%memit
_ = [(i, j) for i, j in double_loop_gen(arr) if j == 2]
%%memit
_ = [i for i in double_loop_no_gen(arr) if i[1] == 2]
과연... 결과는?
double_loop_gen : peak memory: 651.28 MiB, increment: 0.00 MiB
double_loop_no_gen : peak memory: 3090.04 MiB, increment: 2438.76 MiB
그럼 배열 길이에 '0' 하나만 더 붙여보면...
로직이 수행되는 (걸리는) 시간까지 확인을 해보면,
arr = [list(range(50000000)), list(range(50000000)), list(range(50000000))]
이 부분만 바꾸고, 위의 테스트 표현식은 같게끔 유지 하고~
아....
일단!
double_loop_gen,
double_loop_no_gen 는... 끝나면 꼭 결과를 남겨두어야 겠다...
#
double_loop_gen : CPU times: user 19.4 s, sys: 571 ms, total: 19.9 s
double_loop_no_gen : ?
딥러닝 또는 데이터 엔지니어 쪽에서,
특히 파이썬을 쓴다면,
Generator 를 어느정도 깊이있게 이해하고 사용하면
도움이 많이 된다.