2024-04-20 08:48:59 发布
网友
在c语言中,有一个例子说明了内存利用的重要性:使用3个for循环(i,j,k)的朴素矩阵乘法。可以证明,由于内存合并,使用(i,k,j)比使用(i,j,k)快得多。在pythonnumpy中,if索引的顺序(同样是naive3循环,而不是np.dot)并不重要。为什么
首先,您需要知道为什么循环(i,k,j)比C上的(i,j,k)快。这是因为内存使用优化,在您的计算机内存中,矩阵是以线性方式分配的,因此如果您使用(i,k,j)进行迭代,那么您使用的是对您有利的方法,即每个循环占用一块内存并加载到RAM中。如果您使用(i,j,k),您就是在使用它,并且每一步都会向您的RAM加载一个内存块,并在下一步放弃,因为您是在迭代跳转块
(i,k,j)
(i,j,k)
numpy的实现为您处理它,因此即使您使用最坏的顺序,numpy也会命令它更快地工作
numpy
丢弃缓存并一直更改它的事件称为Cache miss
在this link您可以看到一个更好的解释,关于内存是如何分配的,以及为什么它在某些特定的i部分中更快
首先,您需要知道为什么循环
(i,k,j)
比C上的(i,j,k)
快。这是因为内存使用优化,在您的计算机内存中,矩阵是以线性方式分配的,因此如果您使用(i,k,j)
进行迭代,那么您使用的是对您有利的方法,即每个循环占用一块内存并加载到RAM中。如果您使用(i,j,k)
,您就是在使用它,并且每一步都会向您的RAM加载一个内存块,并在下一步放弃,因为您是在迭代跳转块numpy
的实现为您处理它,因此即使您使用最坏的顺序,numpy
也会命令它更快地工作丢弃缓存并一直更改它的事件称为Cache miss
在this link您可以看到一个更好的解释,关于内存是如何分配的,以及为什么它在某些特定的i部分中更快
相关问题 更多 >
编程相关推荐