diff --git "a/8th_members/\352\271\200\354\233\220\352\262\275/11\354\243\274\354\260\250.md" "b/8th_members/\352\271\200\354\233\220\352\262\275/11\354\243\274\354\260\250.md" new file mode 100644 index 0000000..61eca46 --- /dev/null +++ "b/8th_members/\352\271\200\354\233\220\352\262\275/11\354\243\274\354\260\250.md" @@ -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가 더 낮음