묭동이 개발 블로그
  • [Python] list comprehension vs generator expression
    2024년 01월 22일 10시 16분 20초에 업로드 된 글입니다.
    작성자: 묭동이

    list comprehension(리스트 컴프리헨션)

    • 리스트 컴프리헨션은 결과 리스트메모리에 한 번에 저장한다.
    • 모든 요소를 계산하여 메모리에 저장하는 데 시간이 소요된다. 
    • 데이터 크기가 클 때는 상당한 메모리를 사용하고, 초기 생성 시간이 더 걸릴 수 있다. 

     

     

     

    리스트 컴프리헨션의 기본 구조

    [expression for item in iterable if condition]
    • expression : 각 아이템에 대해 실행될 표현식
    • for item in iterable: 반복할 수 있는 객체(iterable)에 대한 반복문
      • item : 반복 중 현재 아이템
      • iterable : 반복할 대상(예: 리스트, 튜플, 문자열 등)
    • if condition (optional): if 조건을 만족하는 아이템에 대해서만 expression이 적용
      • 예: if x > 0은 양수인 아이템에만 표현식을 적용
    • 예시 : 0부터 9까지의 숫자 중에서 짝수의 제곱으로 이루어진 리스트를 생성하는 리스트 컴프리헨션
    squares_of_evens = [x ** 2 for x in range(10) if x % 2 == 0]

    generator expression(제너레이터 표현식)

    • 제너레이터 표현식은 요소를 필요할 때마다 하나씩 생성한다.
    • 초기 생성 시간은 빠르지만, 각 요소에 접근할 때마다 계산이 수행되므로 접근 시간이 늘어날 수 있다.
    • 메모리 효율성이 높지만, 모든 요소를 순회하는 데는 더 많은 시간이 걸릴 수 있다.

     

     

     

    제너레이터 표현식의 기본 구조

    (expression for item in iterable if condition)
    •  expression : 현재 아이템에 대한 표현식
    • item : iterable에서 반복되는 각 요소
    • if condition (optional) : if 조건을 만족하는 아이템에 대해서만 표현식이 적용된다.
    • 예시 : 0부터 9까지의 숫자 중 짝수만을 제곱하여 반환하는 제너레이터 표현식
    squares_of_evens = (num ** 2 for num in range(10) if num % 2 == 0)

     


    list comprehension vs generator expression

    • 제너레이터 표현식은 한 번에 하나의 요소만을 생성하며, 반복될 때만 생성한다.
    • 반면, 리스트 컴프리헨션은 전체 리스트에 대한 메모리를 미리 할당하므로 제너레이터 표현식은 리스트에 비해 메모리 효율성이 더 높다
    # sys 모듈에서 getsizeof 함수를 가져옴
    from sys import getsizeof
    
    # 리스트 컴프리헨션
    comp = [i for i in range(10000)]
    # 제너레이터 표현식
    gen = (i for i in range(10000))
    
    # 리스트 컴프리헨션의 메모리 크기 측정
    x = getsizeof(comp)
    print("리스트 컴프리헨션 크기 = ", x)
    
    # 제너레이터 표현식의 메모리 크기 측정
    y = getsizeof(gen)
    print("제너레이터 표현식 크기 = ", y)
    
    import timeit
    
    # 리스트 컴프리헨션 실행 시간 측정
    list_com_time = timeit.timeit('''list_com = [i for i in range(100) if i % 2 == 0]''', number=1000000)
    print("리스트 컴프리헨션 실행 시간 = ", list_com_time)
    
    # 제너레이터 표현식 실행 시간 측정
    gen_exp_time = timeit.timeit('''gen_exp = (i for i in range(100) if i % 2 == 0)''', number=1000000)
    print("제너레이터 표현식 실행 시간 = ", gen_exp_time)

     

    예시 코드 출력결과 메모리 크기와 실행시간이 제너레이터 표현식이 효율적인 것을 확인할 수 있다.


    Reference

     

    Python List Comprehensions vs Generator Expressions - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org

     

    댓글