Python: Comprehension

Tasic·2021년 5월 17일
0

Python

목록 보기
7/7
post-thumbnail

Comprehension(컴프리헨션) 이란?

한 Sequence가 다른 Sequence (Iterable Object)로부터 (변형되어) 구축될 수 있게한 기능이 있습니다.

Python 2 에서는 List Comprehension (리스트 내포)만을 지원하며, Python 3 에서는 Dictionary Comprehension과 Set Comprehension을 추가로 지원하고 있습니다.

List Comprehension

새로운 List를 만들 때 사용할 수 있는 간단한 표현식으로 대괄호 []를 사용하여 작성합니다.

[표현식 for 원소 in 반복 가능한 객체]
[표현식 for 원소 in 반복 가능한 객체 if 문]

예시: 1부터 10까지의 수 중에서 홀수를 list로 만들기

odd_numbers = [e for e in range(1, 11) if e % 2 == 1]
[1, 3, 5, 7, 9]

Set Comprehension

새로운 Set을 만들 때 사용할 수 있는 간단한 표현식으로 중괄호 {}를 사용하여 작성합니다.

{표현식 for 원소 in 반복 가능한 객체}
{표현식 for 원소 in 반복 가능한 객체 if 문}

예시: list형태의 도시이름들에서 중복을 제거하고 각 요소 뒤에 'is good' 붙이기

cities = ["Seoul", "Shanghai", "Seoul", "Jakarta", "Seoul", "Guangzhou"]
unique_of_city = {city+" is good" for city in cities}
{'Guangzhou is good', 'Jakarta is good', 'Seoul is good', 'Shanghai is good'}

Dictionary Comprehension

새로운 Dictionary를 만들 때 사용할 수 있는 간단한 표현식으로 중괄호 {}를 사용하여 작성합니다.
set과 같은 중괄호를 사용하지만 표현식 부분을 Key:value 형태로 작성해야됩니다.

{표현식 for 원소 in 반복 가능한 객체}
{표현식 for 원소 in 반복 가능한 객체 if 문}

예시: set형태의 list를 dictionary로 변경

population_of_city = [('Tokyo', 36923000), ('Shanghai', 34000000), ('Jakarta', 30000000), ('Seoul', 25514000), ('Guangzhou', 25000000), ('Beijing', 24900000), ('Karachi', 24300000 ), ('Shenzhen', 23300000), ('Delhi', 21753486)]

cities = {c[0]:c[1] for c in population_of_city}
{'Tokyo': 36923000,
 'Shanghai': 34000000,
 'Jakarta': 30000000,
 'Seoul': 25514000,
 'Guangzhou': 25000000,
 'Beijing': 24900000,
 'Karachi': 24300000,
 'Shenzhen': 23300000,
 'Delhi': 21753486}

일반 for문과 성능 비교

import timeit

def for_loop():
    num_list = []
    
    for i in range(100000):
        num_list.append(i)

def list_comprehension():
    num_list = []
    num_list = [ i for i in range(100000) ]

if __name__ == "__main__":
    time1 = timeit.Timer("for_loop()", "from __main__ import for_loop")
    print("for loop time = ", time1.timeit(number=1000), "msc")

    time2 = timeit.Timer("list_comprehension()", "from __main__ import list_comprehension")
    print("list_comprehension time = ", time2.timeit(number=1000), "msc")
for loop time =  8.610124218000237
list_comprehension time =  4.772596685000281

Test pc로는 1부터 99999까지 더하는 로직이 일반적인 for loop보다 두배정도 더 빠르게 실행됨을 확인할 수 있었습니다.
다만 2배라는 수치가 절대적인 것은 아니고 일반적인 for loop보다 빠르다만 기억하면 될듯 합니다.

결론

  1. Comprehension으로 작성한 코드는 간결하고, 성능도 일반 for loop 보다 좋아서 새로운 객체를 만들때 사용하면 좋을 것 같습니다.

  2. 성능개선을 하기 위해서 컴프리헨션을 사용하기도 하지만 모든 상황에서 Comprehension이 만능은 아닙니다. 예를 들어 코드의 가독성을 위해서는 여러 줄의 표현식과 조건문으로 표현하는 것이 이중 for문의 복잡한 Comprehension 한줄로 코딩하는 것보다 나은 경우도 있습니다.

Reference

Python Comprehension - 예제로 배우는 파이썬 프로그래밍
Comprehensions & Generator Expressions - Google Python Stylee Guide

profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글