👍 파이썬의 리스트는 크기가 동적으로 할당되어 요소를 추가할때마다 새로운 공간을 할당해야한다.
따라서 파이썬의 리스트의 크기를 최대치로 미리 확보하면 오버헤드를 줄일 수 있다.a_list = [0] * 100000
위에서 말했던 것처럼 메모리 재할당 과정을 줄이기 위해 크기를 미리 크게 지정해 줄 수 있다.
a_list = [0]*100000
#아래 코드는 빈 리스트 []를 100번 반복해서 연결하는 코드로 결과는 빈 리스트이다.
b_list = [] * 100
+
: 2개이상의 리스트를 하나의 리스트로 합쳐준다. *
: 리스트를 반복에서 하나의 리스트로 만들어준다.my_list[시작:끝(:스텝)]
# 시작부터 (끝 - 1)까지 슬라이싱한다.
a_list = [1,2,3]
a_list[:1] = [4,5]
>>> [4, 5, 2, 3]
a_list[0] = [7,8,9]
>>> [[7, 8, 9], 5, 2, 3]
존재하지 않는 인덱스로 접근할 경우 오류가 난다.
연산 | 시간복잡도 | 설명 |
---|---|---|
len(a) | O(1) | 전체 요소의 개수를 리턴한다. |
a[i] | O(1) | 인덱스 i의 요소를 가져온다. |
a[i:j] | O(j-i) | i부터 j전까지의 요소를 가져온다. |
x in list | O(n) | x가 존재하는지 확인한다. |
a.count(x) | O(n) | x의 개수를 리턴한다. |
a.index(x) | O(n) | x의 인덱스를 리턴한다. |
a.append(x) | O(1) | 마지막에 x를 추가한다. |
a.pop() | O(1) | 마지막 요소를 추출한다. |
a.pop(0) | O(n) | 첫번째 요소를 추출한다. 이럴 경우 리스트보다는 deque를 권장한다. |
del a[i] | O(n) | 최악의 경우 n이다. |
a.sort() | O(n log n) | 정렬한다. |
min(a), max(a) | O(n) | 선형 탐색이 필요하다. |
a.reverse() | O(n) | 뒤집는다. |
순서가 필요하고, index의 값을 사용해야할 경우 List를 사용하자.
검색이 필요한 경우 set, Dictionary를 사용하자.
자료구조 | 접근 | 탐색 | 삽입 | 삭제 |
---|---|---|---|---|
배열 | O(1) | O(n) | O(n) | O(n) |
스택 | O(n) | O(n) | O(1) | O(1) |
큐 | O(n) | O(n) | O(1) | O(1) |
링크드 리스트 | O(n) | O(n) | O(1) | O(1) |
해시테이블 | N/A | O(1) | O(1) | O(1) |
이진 탐색 트리 | O(log n) | O(log n) | O(log n) | O(log n) |