2017-05-24 51 views
0

在下列情況下,爲什麼訪問arr的速度明顯快於arr[:]arr[::]訪問一個numpy數組'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 

並非所有上述方法訪問內存中的連續塊元素?訪問存儲器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) 

回答

3

既不arr也不arr[:]實際上訪問陣列的緩衝器。 arr僅加載對該數組的引用,而arr[:]構造由相同緩衝區支持的新對象。 arr[:]要貴得多,創建對象是什麼,但它實際上並沒有對後臺緩衝區做任何事情。

+2

您的評論也適用於'arr [:: 2]'。由於解析索引需要額外的工作,因此速度較慢。 – Eric

相關問題