2016-06-30 52 views
2

在給定完全相同的數據的情況下,哪個對象在內存中通常較小:使用dtype int64的一個numpy數組或一個類型爲int的C++向量?例如:Numpy數組與內存效率的C++向量

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

我猜C++向量 - numpy數組可能會攜帶更多元數據(因爲python類型與C類型相比相當大)。有了這個說法,內存使用差異可能會很小(無關緊要),除非您製作大量的數組。 – mgilson

+0

不要忘記使用其他語言中的其中一種數據類型所需的開銷。 – user2357112

+1

在我知道的大多數現代C++實現中,「int」是32位。如果你想要一個64位的類型,使用'std :: int64_t'。 –

回答

2

有有效2份到np.array - 對象內務操作,再加屬性,如形狀和進展,和一個數據緩衝器。第一個尺寸與所有陣列的尺寸大致相同,第二個尺寸與元素數量(以及每個元素的尺寸)一致。在numpy數據緩衝區是1d,無論陣列形狀如何。

只有2個元素,示例數組的開銷部分可能大於databuffer。但具有1000個元素的大小比例是相反的。

使用np.save保存數組將大致介紹內存使用情況。該文件格式寫入一個頭緩衝區(256字節?),其餘的是數據緩衝區。

我對C++存儲不太熟悉,但我認爲它更透明(如果您知道該語言)。

但是記住存儲一個數組的效率只是故事的一部分。在實踐中,你需要考慮數學和索引時使用的內存。 viewcopy之間的差異使得難以預測正在使用多少內存。

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實用程序,您可以使用out-of-當你使用'numpy.ndarray'時(不要說在NumPy的API和其他類似的東西上構建OpenCL擴展)......如果你可以用'std :: vector '來實現你的算法,這很難被打敗;值得記住的是,對於大多數情況來說,這並不是一個完美的選擇,而不需要先做一些大O的工作。 – fish2000