C contiguous 指的是数组的行存储在内存中的地址是连续的,
与之对应的是 F contiguous,指的是数组的列存储在内存中的地址是连续的,
Pascal, C,C++,Python 都是行优先存储,即内存中同行的元素存在一起;
而 Fortran,MatLab 是列优先存储,即内存中同列的元素存在一起。
这种设计有什么好处呢?
当然是为了提升访问速度!
一般从内存读取数据的时候会将数据相邻的内容一起读,方便缓存加速。
如果一个矩阵是行连续的,那它的转置就是列连续的,下面这个例子说明了这一点:
>>> a = np.random.random((5,5))
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> a.T.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
可见,numpy 生成的随机矩阵默认是行连续的。
我们对一个行连续的矩阵求行和和列和,你猜结果谁更快?