#背景
「配列の要素に先頭から最後まで順番にアクセスしていく」処理が必要になったが、配列が大きくなると、結構重い処理になる。少しでもアクセス速度を上げたい。
この記事の改良(https://qiita.com/pegasusBS15/items/75da968c9d3ee285f851)
前の記事は配列の生成とアクセスが混交していたので、分けて速度を確認
#環境
- macOS High Sierra10.13.5
- Python3.6.4
- Jupyter notebook5.5.0
#方法
比較する配列の型は4種類
- リスト
- 辞書
- タプル
- Numpyのarray
各配列は一次元で0から999の数字を格納
処理時間の計測はJupyter notebook上でマジックコマンド%timeit
、%%timeit
を使用
複数回実行して、処理時間の平均・標準偏差を出してくれるので、処理時間にばらつきのあるプログラムの時に便利
#結果
###リスト型
####生成
%timeit List = list(range(10**3))
15.8 µs ± 546 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
####アクセス
List = list(range(10**3))
b = 0
%timeit for w in List: b = w
14.9 µs ± 364 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
###タプル型
####生成
%timeit Tuple = tuple(range(10**3))
14.3 µs ± 99.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
####アクセス
Tuple = tuple(range(10**3))
b = 0
%timeit for w in Tuple: b = w
15 µs ± 72.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
###辞書型
####生成
%timeit Dict = {i:i for i in range(10**3)}
63.3 µs ± 2.18 µs per loop (mean ± std. dev. of 7 runs, 100
####アクセス
Dict = {i:i for i in range(10**3)}
b = 0
%timeit for w in Dict: b = w
20.5 µs ± 381 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
###Numpyのarray型
####生成
%%timeit
import numpy as np
Array = np.array([range(10**3)])
106 µs ± 2.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
#####生成(一応import抜いたら)
import numpy as np
%timeit Array = np.array([range(10**3)])
97.4 µs ± 332 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each
####アクセス
import numpy as np
Array = np.array([range(10**3)])
b = 0
%timeit for w in Array: b = w
862 ns ± 171 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
※単位がこれだけns
#結論
生成だけならListやTupleが速い
Numpyのarrayは生成遅いけど、アクセスが圧倒的に速い
何度もアクセスする場合はNumpyが良さそう
※用途に合わせて使い分ける
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い