在以下方案中,为什么访问arr
的速度明显快于arr[:]
或arr[::]
。
In [1]: import numpy as np
In [2]: arr = np.random.randint(0, 255, (512, 512))
In [3]: %timeit arr
30.8 ns ± 2.43 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit arr[:]
204 ns ± 0.588 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [5]: %timeit arr[::]
204 ns ± 1.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [8]: np.all(arr == arr[:])
Out[8]: True
In [9]: np.all(arr == arr[::])
Out[9]: True
Aren以上所有方法都在访问内存中连续的元素块?访问内存arr[::2]
中的不连续块比arr[:]
慢,但与a
和a[:]
之间的差异相比仅略有增加。
In [10]: %timeit arr[::2]
221 ns ± 2.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
答案 0 :(得分:3)
arr
和arr[:]
实际上访问数组的缓冲区。 arr
仅加载对数组的引用,而arr[:]
构造由同一缓冲区支持的新对象。对于创建对象,arr[:]
要贵得多,但它实际上并没有对后备缓冲区做任何事情。