Python List vs Numpy Array 메모리 구조
Python List
Numpy Array
Python List는 List 내부에 공간이 먼저 할당되고, 공간이 각각의 Value값이 있는 Integer Objects를 바라보고 있다는 것이다
이에 대비한 Numpy Array는 Array Object 내부에 할당된 공간이, 실제 Integer Object가 있는 장소 라는것이다
Numpy array Memory
Numpy array = rawdata(refer to databuffer) + rawdata에 대한 정보
- 연속형 고정블록 메모리를 가지고있다(C-order or Fortran-order)
rawdata
Numpy array에서 가지는 rawdata는 다음과 같은 정보를 가지고 있다
- 데이터의 크기
- data buffer에서 몇번째 오프셋부터 시작하는지
- 차원의 수 + 차원의 크기
- Stride(각각의 차원에서 할당하는 메모리의 크기)
- 데이터의 바이트순서
- data buffer의 읽기전용 여부
- 사용하는 자료형(int, float … character )
- C-order(Row major) or Fortran-order(Column major)
View
Numpy Array의 연산 중 일부(Slicing, Transpose)는
rawdata는 변동이 없고, Metadata만 바꾸는 방식을 사용한다
이렇게 했을때 장점은, 연산에 따라서 ‘데이터의 정렬 순서를 바꾸거나, 새롭게 공간 할당을 하지 않고도’
마치 정렬 하거나, 새롭게 공간 할당을 해준것만 같게 만든다.
이를 정확한 표현으로는 기존 데이터에 대해서, 새로운 메타데이터를 만들고, 이를 rawdata(data buffer)에 새로운 View를 만든다고 표현한다
VIEW를 만드는것은 새로운 객체를만드는것이아니다. 기존 객체(data buffer)에 참조하는 형식으로진행된다.
따라서, 기존객체를 참조하는 모든VIEW를 제거하지않는이상, 기존객체(data buffer)는 제거되지 않는다
가령 예시를 들어서
Numpy array로 [1,2,3,4,5] 로 연속된 array를 만들면
지금 만든 array는
원본 데이터 : [1,2,3,4,5]
메타 데이터 : [1~5가 연속]
근데 원본데이터에 대해서 홀수만 인덱싱 하는 연산을 적용해서, 새로운 array를 접근하고자 한다면
원본 데이터 : [1,2,3,4,5]
메타 데이터 : [홀수]
유저가 보게될 데이터 => [1,3,5]
View는 과연 좋기만 한걸까?
Numpy Array는 연산을 통해 새로운 객체를 만들때
연산과정거쳐도 원본데이터를 유지한 채, 새로운 metadata를 만들어서 View를 만든다고 했다
그렇다면 새롭게 객체를 만들면, 추가적으로 할당되는 메모리 용량은 metadata 밖에 없다
그렇다면 과연 View 는 꼭 좋기만 할까? 꼭 그런것만은 아니다
Python 에서의 Garbage Collector는 객체를 보고있는 Object가 없어져야, Garbage Collector가 작동해서 리소스를 해제 하는 방식을 사용하는데
Numpy Array의 경우 원본데이터를 유지한체, 새롭게 객체를 보는 Object(위 경우는 metadata)가 추가적으로 생기기때문에, 리소스를 해제하지 않는다
따라서, View 는 꼭 좋은것만은 아니며, 리소스 관리를 위해서 적절하게 새로운 객체를만들어 주는것도 필요하다
.base
원본 객체와 공유하는지 확인하는 메소드
- View로 만든 객체는,원본 객체와 메모리를 공유하는 특성을 사용한다
- True/False 로 리턴시킬 때 사용한다
Memory Layout Effect
x
는 20000개의 블록을 연속되게 저장시켰지만,y
는 20000개의 블록을 불연속으로 저장시켰다
.sum()
을 통해서 합계내는 시간을 timeit 로 확인해본 결과 2.1초 정도의 차이가 존재했다
차이가 나는 이유는 Cache block size때문이다.
Cache는 특정데이터를 가져올때, 지정된 위치 근처에 있는 데이터도 조만간 사용하겠지?라는 특징
(캐시 메모리 지역성,공간성) 때문에 특정데이터 근처의 데이터도 함께 가져온다
x
는 캐시메모리에 있는 데이터를 연속적으로 가져오는 반면y
는 연속적으로 캐시메모리에서 얻을수 없기 때문에 상대적으로 느리다
'Dev' 카테고리의 다른 글
MAC git clone XCRUN에러 해결 (0) | 2023.03.20 |
---|---|
아파치 오픈소스 다운로드아카이브 http://dlcdn.apache.org (0) | 2022.11.12 |
Apache Arrow가 뭘까? (0) | 2022.11.01 |
Parquet는 왜 쓸까? (0) | 2022.11.01 |
PyObject 객체와 Numpy (0) | 2022.10.29 |