为什么这么慢 这很慢,因为内存访问模式非常低效。事实上,随机访问速度很慢,因为处理器无法预测它们。因此,它会导致昂贵的缓存未命中(如果阵列不适合一级/二级缓存),这是无法通过提前预取数据来避免的。问题是数组太大了,无法放入缓存:index_a和a每457个MiB和b每156个KiB。因此,对b的访问通常在延迟更高的二级缓存中完成,而对另外两个阵列的访问则在RAM中完成。这是缓慢的,因为当前的DDR RAM在一台典型的PC上有巨大的延迟60-100 ns。更糟糕的是:这种延迟在不久的将来可能不会小很多:RAM延迟自过去20年以来没有太大变化。这就是记忆墙。还要注意的是,当随机位置的值被请求时,现代处理器通常会从RAM中获取64字节的完整缓存线(导致仅浪费56/64=87.5%的带宽)。最后,生成随机数是一个非常昂贵的过程,尤其是大整数,np.random.randint可以针对目标平台生成32-bit或64-bit整数。 如何改善这一点 第一个改进是在最相邻的维度上选择间接寻址,这通常是最后一个维度,因为a[:,i]比a[i,:]慢。可以转置数组并交换索引值。然而,Numpytransposition函数只返回一个视图,实际上并不在内存中转置数组。因此,目前需要一个明确的副本。这里最好的方法是直接生成数组,这样访问就更高效(而不是使用昂贵的换位)。注意:您可以使用简单的精度,这样阵列