2016-06-30 3 views
2

정확히 같은 데이터가 주어지면 일반적으로 어떤 개체가 메모리가 더 작습니다 : dtype int64 또는 int 유형의 C++ 벡터가있는 numpy 배열? - 물체의 오버 헤드를 더한 형상 진보 및 데이터 버퍼와 같은 특성이있다Numpy 배열 대 메모리 효율성의 C++ 벡터

v = np.array([34, 23]) 
std::vector<int> v { 34,23 }; 
+1

나는 C++ 벡터 - numpy 배열이 (C 타입에 비해 꽤 큰 파이썬 타입으로서) 더 많은 메타 데이터를 가지고 다니기 쉽다고 생각한다. 당신이 배열을 많이 사용하지 않는다면 메모리 사용량의 차이는 작을 것입니다. – mgilson

+0

다른 언어에서 이러한 데이터 형식 중 하나를 사용해야하는 오버 헤드를 잊지 마십시오. – user2357112

+1

내가 알고있는 대부분의 최신 C++ 구현에서 'int'는 32 비트입니다. 64 비트 타입을 원하면'std :: int64_t'를 사용하십시오. –

답변

2

효과적으로 2 부 np.array 내지 An : 예. 첫 번째 배열은 모든 배열에 대해 대략 동일한 크기를 가지며 두 번째 스케일은 요소 수 (및 각 요소의 크기)와 동일합니다. numpy에서 데이터 버퍼는 배열 모양에 관계없이 1d입니다.

예제 요소 배열의 오버 헤드 부분이 데이터 버퍼보다 ​​클 수 있습니다. 하지만 1000 가지 요소를 사용하면 크기 비율이 다른 방향으로 이동합니다.

배열을 np.save으로 저장하면 메모리 사용에 대한 대략적인 아이디어를 얻을 수 있습니다. 이 파일 형식은 헤더 버퍼 (256 바이트?)를 쓰고 나머지는 데이터 버퍼입니다.

저는 C++ 저장소에 익숙하지 않습니다. 언어가 더 명확하다면 더 투명하다고 생각합니다.

그러나 하나의 배열을 저장할 때의 효율성을 기억하는 것은 이야기의 일부일뿐입니다. 실제로 수학과 색인을 만들 때 메모리 사용에 관해 생각할 필요가 있습니다. ndarrayviewcopy을 구별하여 얼마나 많은 메모리가 사용되는지 예측하기 어렵게 만듭니다.

In [1155]: np.save('test.npy',np.array([1,2])) 

In [1156]: ls -l test.npy 
-rw-rw-r-- 1 paul paul 88 Jun 30 17:08 test.npy 

In [1157]: np.save('test.npy',np.arange(1000)) 

In [1158]: ls -l test.npy 
-rw-rw-r-- 1 paul paul 4080 Jun 30 17:08 test.npy 

이것은 80 바이트의 헤더와 4 * len 바이트의 데이터입니다.

+0

실제로 상대적 개념이라는 효율성에 대한 요점이 여기에 핵심입니다. 'std :: vector '은 컴파일 할 때 최적화되고 보장 된 인접 슈퍼 ​​얇은 래퍼이며, 벡터/텐서 연산이나 최적화 된 I/O 유틸리티를 가지고 있지 않다. 'numpy.ndarray'를 사용할 때 (NumPy의 API와 다른 것들을 기반으로하는 OpenCL 확장 기능들 중 아무 것도 말하지 않고) ...'std :: vector '으로 알고리즘을 구현할 수 있다면 그것은 어렵습니다; 그것은 먼저 큰 일을 조금하지 않고서는 대부분의 경우에 완벽하게 맞지 않는다는 것을 기억할 가치가 있습니다. – fish2000