Skip to content

Commit

Permalink
[김원경] 11주차 미션 제출 (#127)
Browse files Browse the repository at this point in the history
  • Loading branch information
secureWKkim authored Jul 6, 2024
1 parent c049703 commit c579be0
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions 8th_members/김원경/11주차.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 원하는 Type 분석해보기: List 타입
### 1. data structure of python list
![enter image description here](https://miro.medium.com/max/720/1*OJr_4YC6OMB30XQzvPmPkw.png)
![enter image description here](https://devocean.sk.com/CKFinderJava/userfiles/images/py%EA%B5%AC%EC%A1%B0.png)
### Python list data structure
![enter image description here](https://miro.medium.com/max/720/1*l1O3TOk75WyRzrDn2bUe5A.png)
- PyListObject: python list의 C 구현체.
- PyObject_VAR_HEAD: 인스턴스마다 길이가 변하는 객체를 선언할 때 사용되는 macro.
- **ob_item: 이중 포인터 (리스트 원소들의 포인터 배열에 대한 포인터). 객체 주소들을 저장한다.
- allocated: 리스트에 할당된 크기
- **Py__Object: 모든 클래스들의 조상인 PyObject를 상속받은 뒤 __에 type명(ex: int, var, list, array etc.)을 붙여 각 타입에 대한 파이썬 클래스를 구현.

이에 의해 파생되는 특징들?
#### 1) 동적 타입 지원
![enter image description here](https://devocean.sk.com/CKFinderJava/userfiles/images/image%282671%29.png)
한 연산 수행 중간중간에 type checking이 많아 정적 배열보다 동작 느림

#### 2) 크기가 가변적(동적)
처음에 크기를 작게 잡아뒀다 꽉 차면 list_resize 메서드를 작동시켜 크기를 늘려준다. (용어: 더블링)
→ 해당 작업 발생 시 정적 배열보다 동작 속도 느려짐

#### 3) 포인터를 이중으로 거침
ob_items**의 특징에 의해 value를 바로 얻을 수 없어 속도 느림

#### 4) 캐시의 메모리 지역성 문제
![enter image description here](https://computerscience.chemeketa.edu/cs160Reader/_images/Memory-Hierarchy.jpg)
![enter image description here](https://devocean.sk.com/CKFinderJava/userfiles/images/image%282672%29.png)
![enter image description here](https://devocean.sk.com/CKFinderJava/userfiles/images/image%282673%29.png)
list의 0, 1번 객체 즉 PyObject를 가리키는 포인터 주소는 메모리 상에서 인접하지만 value는 인접하지 않음
→ nparray와 비교하면, 캐싱 시 메모리 지역성 문제로 cache hit rate가 더 낮음

0 comments on commit c579be0

Please sign in to comment.