본문 바로가기
Python/Python FAQ

NumPy가 일반적인 Python 리스트에 비해 어떤 이점이 있나요?, What are the advantages of NumPy over regular Python lists?

by 베타코드 2023. 10. 5.
반응형

질문


NumPy

을 사용하는 것과 일반적인 Python 리스트의 장점은 무엇인가요?

저는 약 100개의 금융 시장 데이터를 가지고 있으며, 100x100x100 = 1백만 개의 셀로 이루어진 큐브 배열을 만들 계획입니다. 각 x와 각 y 및 z를 (3개 변수로) 회귀분석하여 표준 오차로 배열을 채울 것입니다.

"큰 행렬"의 경우 성능과 확장성을 위해 Python 리스트 대신 NumPy를 사용해야 한다는 말을 들었습니다. 문제는, 저는 Python 리스트를 알고 있고 제게 잘 작동하는 것 같습니다.

NumPy로 전환하면 어떤 이점이 있을까요?

만약 큐브에 1000개의 데이터 시리즈가 있다면 (즉, 큐브에 10억 개의 부동 소수점 셀이 있는 경우) 어떨까요?


답변


NumPy의 배열은 Python 리스트보다 더 압축됩니다. -- Python에서 설명한 대로 리스트의 리스트는 적어도 20MB 정도의 공간을 차지하지만, NumPy 3D 배열은 실수형 데이터를 사용하고 있으므로 4MB에 들어갑니다. NumPy를 사용하면 항목에 대한 읽기 및 쓰기 접근도 더 빠릅니다.

백만 개의 셀이라면 그렇게 큰 차이를 느끼지 못할 수도 있지만, 10억 개의 셀이라면 당연히 큰 차이를 느끼게 될 것입니다. 32비트 아키텍처에서는 어떤 방법이든 맞지 않지만, 64비트 빌드에서는 NumPy는 약 4GB의 공간을 사용하고, Python 단독으로는 최소 12GB의 공간이 필요합니다 (포인터가 2배로 커지기 때문에). 이는 훨씬 더 비용이 많이 드는 하드웨어입니다!

이 차이는 대부분 "간접성" 때문입니다. -- Python 리스트는 Python 객체에 대한 포인터 배열이며, 포인터당 최소 4바이트 이상이 필요하며, 가장 작은 Python 객체에도 16바이트가 필요합니다 (유형 포인터 4바이트, 참조 카운트 4바이트, 값 4바이트 -- 그리고 메모리 할당기는 16으로 반올림됩니다). NumPy 배열은 동일한 값의 배열입니다 -- 단일 정밀도 숫자는 4바이트, 배정밀도 숫자는 8바이트가 필요합니다. 유연성이 떨어지지만, 표준 Python 리스트의 유연성을 위해서는 상당한 비용을 지불해야 합니다!

반응형

댓글