问题描述
当问题是对称的,因此只需要计算一些数字时,在N维中进行计算的最佳容器对象是什么?
具体来说,对于N = 4,我有:
M=50
results = np.zeros((M,M,M))
for ii in range(M):
for jj in range(ii,M):
for kk in range(jj,M):
for ll in range(kk,M):
res=1 #really some calculation
results[ii,jj,kk,ll] = res
此数组中的许多元素都是完全冗余的,甚至没有被访问。对于更高的N来说更是如此(我想提高到N = 10或理想的是N = 15)。
在这样的问题,字典或稀疏矩阵的每一步中使用列表并追加更好吗?我尝试了一个稀疏矩阵,但是它一直警告我不要经常更改稀疏矩阵中的元素,因此大概这不是一个好主意。
我唯一需要保留的功能就是找到最大值(理想情况下沿每个维度)。
任何见解将不胜感激!
解决方法
矩阵的“密度”将乘以1 / D**2
,其中D
是维数-因此您可以看到空间的收益是指数的,而与列表或稠密矩阵是恒定的。
因此,当维数很大时,稀疏矩阵将在使用的空间上提供巨大的优势,并且它们仍然比列表更快。如果维数较小,则密集矩阵将稍大,但也将稍快(此处略微:快几倍,但由于总执行时间很小,所以绝对差仍然很小)。
总体而言,除非维数固定,否则保留稀疏矩阵会更有意义。但是,如果D
是固定的,则最好仅对此特定情况进行基准测试。