Python
numpy
python3
自分用メモ
速度比較

Pythonの配列アクセス速度比較

背景

配列の要素に先頭から最後まで順番にアクセスしていく処理が必要になったが、配列が大きくなると、結構重い処理になる。少しでもアクセス速度を上げたい。

環境

  • macOS High Sierra10.13.5
  • Python3.6.4
  • Jupyter notebook5.5.0

方法

比較する配列の型は4種類
1. リスト
2. 辞書
3. タプル
4. Numpyのarray
各配列は一次元で0から999の数字を格納。
処理時間の計測はJupyter notebook上でマジックコマンド%%timeitを使用
複数回実行して、処理時間の平均・標準偏差を出してくれるので、処理時間にばらつきのあるプログラムの時に便利。

コードと結果

リスト型

%%timeit
a=[i for i in range(10**3)]
b=0
for w in a:
    b+=w

81.3 µs ± 1.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

辞書型

%%timeit
a=dict(zip([i for i in range(10**3)],[i for i in range(10**3)]))
b=0
for w in a:
    b+=w

164 µs ± 4.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

タプル型

%%timeit
a=(i for i in range(10**3))
b=0
for w in a:
    b+=w

110 µs ± 5.48 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Numpyのarray型

%%timeit
import numpy as np
a=np.array([i for i in range(10**3)])
b=0
for w in a:
    b+=w

194 µs ± 587 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

結論

要素のアクセスに関してはリスト型が一番速い。漠然とNumpyが速いイメージだったので驚き。
※今回の例のような、要素の総和を求めるプログラムなら、本来はnumpy.sumで計算したほうが速い。
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い。