2017-05-24 7 views
0

arrには、arr[:]または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 

上記のアプローチのすべてがメモリ内の連続した要素ブロックにアクセスしているわけではありませんか?メモリ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

どちらarrarr[:]実際アクセス配列のバッファ。 arrは、配列への参照をロードするだけで、arr[:]は、同じバッファをバッキングした新しいオブジェクトを構築します。 arr[:]ははるかに高価ですが、オブジェクトの作成に伴い実際にはバッキングバッファでは何も実行されません。

+2

あなたの発言は 'arr [:: 2]'にも当てはまります。これは、インデックスを解析する余分な作業のために遅くなります。 – Eric

関連する問題