LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-12

背景

配列の要素に先頭から最後まで順番にアクセスしていく処理が必要になったが、配列が大きくなると、結構重い処理になる。少しでもアクセス速度を上げたい。
この記事の改良版→https://qiita.com/pegasusBS15/items/620985fdc21c75ad8026

環境

  • 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で計算したほうが速い。
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い。

6
6
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6