brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jan 29. 2021

Generator vs. No Generator

#누가더, #빠른가?, #좋은가?

케바케?


실제로 돌려보면...

알 수 있지...

금방...


앞서 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 를 어느정도 깊이있게 이해하고 사용하면

도움이 많이 된다.

작가의 이전글 Generator 함수
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari