LoginSignup
8
4

More than 5 years have passed since last update.

Python配列の生成&アクセスの速度

Posted at

背景

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

この記事の改良(https://qiita.com/pegasusBS15/items/75da968c9d3ee285f851)
前の記事は配列の生成とアクセスが混交していたので、分けて速度を確認

環境

  • 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を使用
複数回実行して、処理時間の平均・標準偏差を出してくれるので、処理時間にばらつきのあるプログラムの時に便利

結果

リスト型

生成

%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が良さそう
※用途に合わせて使い分ける
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い

8
4
1

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
8
4