generated from Pseudo-Lab/Jupyter-Book-Template
-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c049703
commit c579be0
Showing
1 changed file
with
30 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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가 더 낮음 |