2014-03-27 64 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左右的开销要低得多。