2014-03-27 99 views
0

優化Python代碼我有一個Python代碼如下:內存效率

import numpy as np 

sizes = 2000 
array1 = np.empty((sizes, sizes, sizes, 3), dtype=np.float32) 
for i in range(sizes): 
    array1[i, :, :, 0] = 1.5*i 
    array1[:, i, :, 1] = 2.5*i 
    array1[:, :, i, 2] = 3.5*i 

array2 = array1.reshape(sizes*sizes*sizes, 3) 

#do something with array2 

array3 = array2.reshape(sizes*sizes*sizes, 3) 

我希望來優化內存使用效率,這個代碼,但我不知道。我可以通過更高效的內存方式使用「numpy.reshape」嗎?

+0

重塑不會讓您的程序更高效的內存。就你而言,你似乎有3 * 3大小的浮動元素。重塑會改變矩陣的形狀,但是元素的數量以及它們所佔用的內存將保持不變。但是,矩陣中的每個值都顯示爲大小^ 2倍。創建這種4D矩陣的意義不明確。你想用它來做什麼? –

回答

1

我認爲你的代碼已經具有內存效率。

如果可能,np.reshape返回原始數組的視圖。在這種情況下就是如此,因此np.reshape已經儘可能提高了內存的效率。

這裏是你如何能告訴np.reshape返回一個觀點:

assert array2[0,0] == 0 

更改相應的值array1

import numpy as np 
# Let's make array1 smaller; it won't change our conclusions 
sizes = 5 
array1 = np.arange(sizes*sizes*sizes*3).reshape((sizes, sizes, sizes, 3)) 

for i in range(sizes): 
    array1[i, :, :, 0] = 1.5*i 
    array1[:, i, :, 1] = 2.5*i 
    array1[:, :, i, 2] = 3.5*i 

array2 = array1.reshape(sizes*sizes*sizes, 3) 

array2在某個位置的值

array1[0,0,0,0] = 100 

請注意,array2的值會更改。

assert array2[0,0] == 100 

由於array2由於array1變形例的更改,可以得出這樣的結論是array2array1的圖。視圖共享底層數據。由於沒有製作副本,因此重塑的內存效率很高。

array2已經是形狀(sizes*sizes*sizes, 3),所以這個重塑什麼也不做。

array3 = array2.reshape(sizes*sizes*sizes, 3) 

最後,斷言下面顯示array3也受到array1所作的修改。所以這證明array3也是array1的觀點。

assert array3[0,0] == 100 
0

所以真的是你的問題取決於你在做什麼數組。您目前正在存儲大量冗餘信息。您可以保留當前存儲信息的0.15%,不會丟失任何內容。

舉例來說,如果我們定義了以下三個一維數組

a = np.linspace(0,(size-1)*1.5,size).astype(np.float32) 
b = np.linspace(0,(size-1)*2.5,size).astype(np.float32) 
c = np.linspace(0,(size-1)*3.5,size).astype(np.float32) 

我們可以創建任意次入口(即在最快的旋轉軸條目)在array1

In [235]: array1[4][3][19] == np.array([a[4],b[3],c[19]]) 
Out[235]: array([ True, True, True], dtype=bool) 

的這一切的使用取決於您對陣列所做的事情,因爲從a,bc重拍array1的性能會降低。但是,如果您接近機器可以處理的範圍,則爲了提高內存效率而犧牲性能可能是必要的步驟。同時移動a,bc左右的開銷要比移動array1左右的開銷要低得多。