显着更快地访问numpy阵列' arr'而不是[:]'

时间:2017-05-24 23:08:25

标签: python arrays performance numpy

在以下方案中,为什么访问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[:]慢,但与aa[:]之间的差异相比仅略有增加。

In [10]: %timeit arr[::2]
221 ns ± 2.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

1 个答案:

答案 0 :(得分:3)

arrarr[:]实际上访问数组的缓冲区。 arr仅加载对数组的引用,而arr[:]构造由同一缓冲区支持的新对象。对于创建对象,arr[:]要贵得多,但它实际上并没有对后备缓冲区做任何事情。