Python矩阵乘法索引交换内存使用示例

标签 python c numpy matrix

在 c 语言中,有一个说明内存利用率重要性的示例:使用 3 个 for 循环 (i,j,k) 的朴素矩阵乘法。并且可以证明,由于内存合并,使用 (i,k,j) 比 (i,j,k) 快得多。在 python numpy 中,索引的顺序(同样是简单的 3 个循环,而不是 np.dot)并不重要。这是为什么?

最佳答案

首先,您需要知道为什么循环 (i,k,j) 在 C 上比 (i,j,k) 更快。​​这是因为内存使用优化,在您的计算机内存中,矩阵以线性方式分配,因此,如果您使用 (i,k,j) 进行迭代,您将在每个循环占用一个 block 的情况下使用它内存并加载到 RAM 中。如果你使用(i,j,k),那么你就是在对抗它,每一步都会将一 block 内存加载到你的RAM中,并在下一步中丢弃,因为你正在迭代跳跃 block 。

numpy 的实现会为您处理它,因此即使您使用最差的顺序,numpy 也会让它工作得更快。

丢弃缓存并一直改变缓存的事件称为Cache miss

this link您可以看到有关如何分配内存以及为什么在某些特定的迭代方式下速度更快的更好解释。

关于Python矩阵乘法索引交换内存使用示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54828517/

相关文章:

过滤execve环境的正确方法

python - 从 Pandas DataFrame 中的所有行中减去第一行

python - Tornado:来自 mysql 的更新数据未显示在由 Tornado 服务的前端中。重启服务器后才显示

python - 如何用 fromiter 构造一个 np.array

c - Head=Current=ptr有什么用;在(c)中?

使用 c 将数组和指针复制到源的最后一个元素之后

python - 如果我的应用程序中有相同的模块,则在 django 中导入全局模块

python - 奇怪的 SciPy ODE 集成错误

python - pandas DataFrame 对角线

python - 剪切一些值为 255 的行和列