为什么Numpy在创建3D阵列方面比2D阵列更快?

时间:2018-03-19 21:42:15

标签: python arrays numpy initialization

从创建Nx4096x4096阵列的时间开始,当N = 2或3比N = 1时,Numpy看起来要快得多:

StartCoroutine

差异令人震惊。为什么如此,以及如何在N = 1的情况下至少与N> 1时一样快。 1?可以"%timeit"对于计时这个是完全错误的吗?

上下文:我需要使用不同的类型(uint8)创建另一个4096 x 4096的单个数组,并且我试图获得最快的Pythonic(或Numpy相关)实现。 Nx4096x4096阵列将填充来自3列阵列(从文件读取)的非零值,其中第1列是1D坐标,第2和第3列是第1和第2图像的强度值(因此N = 2例)。使用稀疏矩阵现在不是一个选项。 这些文件有1.3亿个。所以上述情况发生了很多次。

[编辑]这是在Python 3.6.4下,在macOS Sierra下的numpy 1.14。 Windows下的相同版本不会重现相同的行为。较小数组的np.zeros()占用的时间比两倍大的数组少一半。从评论和提到的重复问题我明白这可能是由于内存分配的阈值。然而,这确实违背了import numpy as np %timeit a = np.zeros((2, 4096, 4096), dtype=np.float32, order='C') 5.24 µs ± 98.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) %timeit a = np.zeros((4096, 4096), dtype=np.float32, order='C') 23.4 ms ± 401 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 的目的。

[编辑2]关于重复的问题,这里的问题现在应该更多地关于如何正确地计算这个函数,而不必编写将访问变量的额外代码,以便OS实际分配内存。那个额外的代码不会偏倚时间的结果吗?难道没有简单的方法来描述这个吗?

0 个答案:

没有答案