2016-06-30 11 views
2

Welches Objekt ist in der Regel kleiner im Speicher bei genau den gleichen Daten: ein numpy Array mit dtype int64 oder ein C++ Vektor des Typs int? Zum Beispiel:Numpy-Array vs. C++ - Vektor in Speicher-Effizienz

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

Ich würde vermuten, die C++ - Vektor - numpy Arrays werden wahrscheinlich mehr Metadaten (als Python-Typen, die ziemlich groß im Vergleich zu C-Typen sind) tragen. Abgesehen davon ist der Unterschied in der Speicherbelegung wahrscheinlich klein (unbedeutend), es sei denn, Sie erstellen viele Arrays. – mgilson

+0

Vergessen Sie nicht den Overhead, den Sie benötigen, um einen dieser Datentypen aus der anderen Sprache zu verwenden. – user2357112

+1

Auf den meisten modernen C++ - Implementierungen, die ich kenne, ist "int" 32 Bit. Wenn Sie einen 64-Bit-Typ wünschen, verwenden Sie 'std :: int64_t'. –

Antwort

2

Es effektiv 2 Teile an ein np.array - Dem Objekt-Overhead und Attribute wie Form und Schritte, und einen Datenpuffer. Der erste hat ungefähr die gleiche Größe für alle Arrays, der zweite skaliert mit der Anzahl der Elemente (und der Größe jedes Elements). In numpy ist der Datenpuffer unabhängig von der Array-Form 1d.

Mit nur 2 Elementen ist der Overhead-Teil Ihres Beispielarrays wahrscheinlich größer als der Datenpuffer. Aber mit 1000 Elementen geht das Größenverhältnis in die andere Richtung.

Wenn Sie das Array mit np.save speichern, erhalten Sie eine grobe Vorstellung von der Speicherbelegung. Dieses Dateiformat schreibt einen Header-Puffer (256 Bytes?), Und der Rest ist der Datenpuffer.

Ich bin weniger vertraut mit C++ - Speicher, obwohl ich denke, dass das transparenter ist (wenn Sie die Sprache kennen).

Aber denken Sie daran, Effizienz beim Speichern eines Arrays ist nur ein Teil der Geschichte. In der Praxis müssen Sie über die Speicherbelegung nachdenken, wenn Sie Mathematik und Indizierung durchführen. Die ndarray Unterscheidung zwischen view und copy macht es schwieriger vorherzusagen, wie viel Speicher verwendet wird.

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 

Das sieht aus wie 80 Bytes Header und 4 * len Bytes für die Daten.

+0

In der Tat ist hier der Schlüssel zur Effizienz ein relativer Begriff. 'std :: vector ' ist ein kompilierzeitoptimierter, garantiert-zusammenhängender superdünner Wrapper um den Speicher, den er zuweist - aber er hat keinen Vektor/Tensor-Ops oder optimierte I/O-Utilities, die man außerhalb des Wenn Sie ein 'numpy.darray' verwenden (von OpenCL-Erweiterungen, die auf der NumPy-API basieren, und anderen ähnlichen Dingen), ... wenn Sie Ihren Algorithmus mit' std :: vector 'implementieren können, ist es schwer zu schlagen; Es lohnt sich, daran zu erinnern, dass es für die meisten Fälle nicht perfekt passt, ohne zuerst ein bisschen O-Arbeit zu machen. – fish2000