데이터의 지역성
ram이 아무리 빨라봐야 cache보다 느리고, cache가 아무리 커봐야 ram보다는 작다
그래서 CPU는 사용할 Data를 cache에 저장하고, Register로 가져와서 계산을 진행한다
CPU가 Data를 찾을때 Data가 Cache에 없으면 (Cache Miss) 데이터를 RAM, SSD 에서 찾아야하는데 이거 시간소모가 꽤 크다
CACHE MISS를 막기위해서 일반적으로 주변의 데이터를 통째로 가져온다(뭉탱이로 가져옴)
근데 이게 PythonObject에서는 배열에 넣어서 인접해보인다고 쳐도, 실제로는 포인터의 주소를 넣은거기때문에, 연속된 값을 넣었다고해도, 실제로 메모리에 할당되는 부분이 인접해있는지를 보장할수가 없는거다 (⇒ Cache Miss가 더 빈번히 발생하겠지)
근데 Numpy에서는 미리 할당된 buffer에 데이터가 C Array형태로 저장되는데
(C Array형태 : 메모리가 이어져 있고, 메모리 부분 하나하나에 연속된 값이 이어지는것이다.)
즉, Numpy Array는 Python Array보다 cache hit rates가 높다고 표현하고(뭉탱이로 가져오니까), 이때문에 Numpy Array가 Python Array보다 빠르다고 한다
넘파이가 빠른 이유
- SIMD 지원
- SIMD : Simple Instruction Multiple Data. CPU에서 지원되는 명령어 셋, 하나의 명령어로 동일한 데이터형태/구조 의 여러데이터를 한번에 처리하는 병렬처리 기법
- INTEL, AMD 계열에서 하는게 AVX
- 자료 : https://numpy.org/doc/stable/reference/simd/index.html
- Python Array는 2중 포인터 형식으로 값에 접근하는데, Numpy는 단일포인터가 버퍼의 주소에 접근하고, 바로 값을 접근한다
'Dev' 카테고리의 다른 글
Apache Arrow가 뭘까? (0) | 2022.11.01 |
---|---|
Parquet는 왜 쓸까? (0) | 2022.11.01 |
서버리스의 장단점 (0) | 2022.08.14 |
파이썬 모듈 재설치, 초기화하는방법 (poppler 설치 후 에러) (0) | 2022.07.13 |
정규화와 역정규화 (0) | 2022.07.08 |