리스트
파이썬 리스트는 굉장히 활용 범위가 큰 자료형입니다. 프로그래밍을 할 때 사실상 리스트만 사용하면 대부분의 경우 필요한 기능을 모두 사용할 수 있죠. 너무 사용 가능 범위가 넓다 보니까 어떤 다른 자료형을 사용할지 생각하지 않고 바로 리스트를 사용해 버리는 경우가 많은데요. 무조건 리스트를 사용해버리면 효율적으로 프로그래밍을 하기 힘듭니다.
이게 무슨 말인지 안 와닿을 수도 있는데요. 코드 예시를 하나 볼게요.
바로 리스트를 사용할 때
여러 개의 데이터(정확히는 0부터 999999까지의 정수)를 저장한 후, 특정 데이터를 탐색하는 코드를 써볼 건데요. 대부분의 상황과 비슷하게 동적 배열로 구현돼 있는 파이썬 리스트를 사용하면 원하는 코드를 쓸 수 있습니다. 바로 해볼게요.
# 예시를 위해 사용할 모듈 import
import time
# 데이터를 리스트에 저장한다
test_list = [x for x in range(0, 1000000)]
# 특정 항목이 리스트에 있는지 확인할 때 걸리는 시간 파악
t_0 = time.time()
999999 in test_list # 리스트 탐색
t_1 = time.time()
print(f"리스트에서 특정 항목을 찾는데 걸린 시간: {t_1 - t_0}")
먼저 파이썬 리스트에 0부터 999999까지의 정수 데이터를 저장했습니다. 딱히 순서 데이터가 필요한 건 아닌데요. 그냥 구체적으로 어떤 연산이 필요한지 생각하지 않고 생각해내기 가장 쉬운 리스트를 사용한 거죠. 여기 999999가 저장되었는지 키워드 in을 사용해서 확인을 해봅시다. 특정 데이터가 자료형 안에 있는지 탐색을 하는 거죠. 이때 파이썬의 time 모듈을 이용해서 시작할 때의 시간과 코드가 끝날 때의 시간을 받아올게요. 두 시간의 차이는 탐색 코드가 실행되는데 걸리는 시간이죠?
리스트에서 특정 항목을 찾는데 걸린 시간: 0.013087987899780273
시간이 0.013초 정도 걸리네요.
구체적으로 어떤 기능이 필요한지 생각해서 세트를 쓰는 경우
정확히 똑같은 기능을 파이썬 리스트가 아닌 세트를 통해서 해볼게요.
# 예시를 위해 사용할 모듈 import
import time
# 데이터를 set에 저장한다
test_set = set([x for x in range(0, 1000000)])
# 특정 항목이 set에 있는지 확인할 때 걸리는 시간 파악
t_0 = time.time()
999999 in test_set
t_1 = time.time()
print(f"세트에서 특정 항목을 찾는데 걸린 시간: {t_1 - t_0}")
코드를 돌려보면…
set에서 특정 항목을 찾는데 걸린 시간: 3.0994415283203125e-06
0.00000309초가 걸렸습니다.
파이썬 리스트와 세트 비교
0.013초와 0.00000309초… 엄청 큰 차이가 아니라고 느껴지실 수도 있는데요. 지금은 탐색 연산을 한 번만 하지만 보통 많은 프로그램들은 이 연산을 반복적이게 하는 경우가 대부분인데요. 이 연산을 1000번 해야 되면 파이썬 리스트는 대략 13초가 걸리고 세트는 0.00309초가 걸립니다. 차이가 느껴지시죠?
파이썬 자료형을 잘 고른다는 것
자료형을 잘 고른다는 것은 현재 자신이 데이터에 하고 싶은 연산들이 뭐가 있고 얼마나 걸릴지에 대해서 잘 생각하는 겁니다. 초급자의 수준을 넘어서기 위해서는 파이썬 자료형 뒤에 가려진 자료 구조를 떠올릴 수 있어야 됩니다. 자료 구조를 떠올리면 각 연산의 시간 복잡도를 떠올릴 수 있기 때문이죠.
위의 예시를 생각해볼게요. 리스트와 세트 모두 데이터를 저장할 수 있고, 저장한 데이터를 탐색할 수 있는 자료형입니다. 근데 리스트는 동적 배열, 세트는 해시 테이블로 구현돼 있죠?
시간 복잡도파이썬 리스트(동적 배열)파이썬 세트(해시 테이블)
시간 복잡도 | 파이썬 리스트(동적 배열) | 파이썬 세트(해시 테이블) |
탐색 연산 |
그럼 위 표에서처럼, 쓰고 싶은 연산의 시간 복잡도를 생각해낼 수 있어야 된다는 거죠. 바로 이 차이가 위에서 본 리스트와 세트를 쓸 때 시간 차이를 만든 겁니다.
세트뿐만 아니라 파이썬 deque를 쓸 때도 마찬가지죠. 더블리 링크드 리스트 연산들의 시간 복잡도를 생각할 수 있어야 되고 이 시간 복잡도를 바탕으로 파이썬 리스트와 비교해서 어떤 자료형을 쓸지를 정할 수 있어야 됩니다.
결론
프로그램이 아무리 좋은 기능을 갖고 있고 좋은 아이디어여도 클릭을 했을 때 13초를 기다려야 되면 사용하기 쉽지 않습니다. 반면 0.00309초면… 일반 사람들은 느낄 수도 없을 정도의 짧은 순간이죠.
파이썬에서 어떤 자료형을 사용할 건지 잘 고르는 건 결국 어떤 자료 구조를 쓸 건지 고르는 것과 비슷합니다. 데이터에 어떤 관계가 필요하고 어떤 기능들을 사용할 건지 잘 생각하면 더 효율적인 프로그램을 쓸 수 있습니다.
출처 코드잇
'Algorithm > 자료구조' 카테고리의 다른 글
[추상 자료형] 파이썬 자료형 주요 시간 복잡도 정리 (0) | 2023.08.07 |
---|---|
[해시 테이블] 해시 테이블 정리 (0) | 2023.08.03 |
[링크드 리스트] 링크드 리스트 정리 (0) | 2023.08.03 |
[해시 테이블] 파이썬 hash 함수 (0) | 2023.08.03 |
[해시 테이블] 해시 함수 (0) | 2023.08.03 |