Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python矩阵乘法索引交换内存使用示例_Python_C_Numpy_Matrix - Fatal编程技术网

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

Python矩阵乘法索引交换内存使用示例,python,c,numpy,matrix,Python,C,Numpy,Matrix,在c语言中,有一个关于内存利用重要性的例子:使用3个for循环(i,j,k)的朴素矩阵乘法。可以看出,由于内存合并,使用(i,k,j)比使用(i,j,k)快得多。在PythonNumpy中,if索引的顺序(同样是朴素的3个循环,而不是np.dot)并不重要。为什么会这样?首先你需要知道为什么循环(i,k,j)比C上的(i,j,k)快。这是因为内存使用优化,在你的计算机内存中矩阵是以线性方式分配的,所以如果你使用(i,k,j)进行迭代在每个循环占用一块内存并加载到RAM的情况下,您使用的是对自己有

在c语言中,有一个关于内存利用重要性的例子:使用3个for循环(i,j,k)的朴素矩阵乘法。可以看出,由于内存合并,使用(i,k,j)比使用(i,j,k)快得多。在PythonNumpy中,if索引的顺序(同样是朴素的3个循环,而不是np.dot)并不重要。为什么会这样?

首先你需要知道为什么循环
(i,k,j)
比C上的
(i,j,k)
快。这是因为内存使用优化,在你的计算机内存中矩阵是以线性方式分配的,所以如果你使用
(i,k,j)进行迭代
在每个循环占用一块内存并加载到RAM的情况下,您使用的是对自己有利的方法。如果您使用
(i,j,k)
,您就是在使用它,每一步都会向RAM加载一块内存,并在下一步放弃,因为您是在迭代跳转块

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

丢弃缓存并一直更改它的事件被调用


在这里,您可以看到一个更好的解释,说明内存是如何分配的,以及为什么它以某种特定的方式更快

本机
c
多维数组不是指向其他数组的指针数组吗?有点像Python嵌套列表
numpy
阵列使用平面数据缓冲,并通过形状和步幅实现多维性。跨步的使用大大减少了对索引顺序的依赖。请为我澄清一下-您是如何在
numpy
中使用/控制索引顺序的?你不是在谈论Python级别的迭代吧?