Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[김원경] 11주차 미션 제출 #127

Merged
merged 2 commits into from
Jul 6, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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가 더 낮음