从创建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实际分配内存。那个额外的代码不会偏倚时间的结果吗?难道没有简单的方法来描述这个吗?