본문 바로가기
프로그래밍/AI

Python List

by slowin 2024. 12. 11.

강사님: 김용담

Python List

리스트란?

  • 특정 순서로 나열된 항목의 모음이다.
  • 동일한 값이 두 번 이상 포함 될 수 있다.
  • 각 항복은 별개의 항목으로 관주 ^1

리스트의 종류

  • Linked Lists
  • Arrays (가변 길이 or dynamic array(동적배열)^2)

파이썬의 리스트

^3

특징

  • 동적 배열
  • 초기 크기를 지정하지 않아도 됨
    • 초기 크기는 0
  • 여러 자료형을 저장 할 수 있음

파이썬 리스트 구조

list_structure

표현 코드

l = list()

요소 추가 과정

^4

  1. 추가
    l.append("a")

리스트 추가 과정

크기가 4 인 블록을 가리키게 된다.

  1. 가득차면?
    파이썬은 가득차면 List의 크기를 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... 이렇게 늘려 간다고 한다.
    증가시키는 알고리즘은, ^3
/* cpython/Objects/listobject.c */ /* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... */ /* currently: new_allocated = 5 + (5 >> 3) + 3 = 8 */ new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);
l.append("a")
l.append("a")
l.append("a") # <- 가득참
l.append("b")

계속 추가해서 가득차면, 새로운 블럭이 늘어난다.
리스트 가득참

추가하는 과정 코드

# 빈 리스트 생성  
lst = []  
print(f"Initial size: {sys.getsizeof(lst)} bytes")  

# 요소 추가하며 메모리 크기 변화 확인  
for i in range(26):  
    lst.append(i)  
    print(f"Length: {len(lst)}, Allocated size: {sys.getsizeof(lst)} bytes")

출력결과

Initial size: 56 bytes
Length: 1, Allocated size: 88 bytes
Length: 2, Allocated size: 88 bytes
Length: 3, Allocated size: 88 bytes
Length: 4, Allocated size: 88 bytes
Length: 5, Allocated size: 120 bytes
Length: 6, Allocated size: 120 bytes
Length: 7, Allocated size: 120 bytes
Length: 8, Allocated size: 120 bytes
Length: 9, Allocated size: 184 bytes
...
Length: 21, Allocated size: 256 bytes
Length: 22, Allocated size: 256 bytes
Length: 23, Allocated size: 256 bytes
Length: 24, Allocated size: 256 bytes
Length: 25, Allocated size: 256 bytes
Length: 26, Allocated size: 336 bytes

요소를 추가하면서 일정구간에서 용량이 갑자기 늘어나는 지점이 있다.
그리고, 일정요소가 추가될때까지 동일한 메모리 공간을 유지하는것을 알 수 있다.

마무리

파이썬의 동적으로 메모리 확장하는 과정을 알아 보았다. 특히, 테스트 코드를 통해 메모리 크기가 동적으로 커지고 유지되는 과정이 흥미로웠다.

'프로그래밍 > AI' 카테고리의 다른 글

Git 학습  (1) 2024.12.16
멀티 쓰레드와 멀티 프로세스  (1) 2024.12.11
해시 함수 와 해시충돌  (1) 2024.12.11
Computational Thinking  (0) 2024.12.06
통계학(6) 공분산 행렬  (0) 2024.12.02