Python リスト追加についての速度比較(append,内包表記など)
Sponsored Links
皆さんこんにちは
お元気ですか。私は元気です。
実は情報技術者試験が終わったんです。ひゃっほー
…受かってそうにないのはまた別のお話
さて、今日は便利なPythonのリストについての速度を比較してみましょう
皆さんこんなコードありませんか
list = [] for i in xrange(N) list.append(array[i]) #arrayは何か入っている適当なリスト
結構使うんですよね、このようなコードの書き方
さて、実はPythonでは複数の書き方ができます。
append,extends,list内包表記です
extendはリストを渡すとそれらをまとめて追加してくれます。前のコードに習って書くとこうなります。
list = [] list.extend(array) #arrayは何か入っている適当なリスト
次はリスト内包表記です。これは他のと異なり、Pythonでしか見られないコードです。
list = [array[i] for i in xrange(N)]
しかし、気になりませんか・・・?どれが素晴らしいのか。レッツトライ
実験環境
OS:X 10.9.2
CPU:2.8GHz IntelCore i7
メモリ:16GB 1600MHz DDR3
実験内容
append,extend(一つ一つのリストを投げる),extend(追加するリスト全て)、リスト内包表記を実行し、速度を比較する。
Time = 10
N = 10000000
因みにTimeで最後は割っています。(平均化)
ソースコード
import time Time = 10 N = 10000000 def list_append(): for i in xrange(Time): array = [] for j in xrange(N): array.append(1) def list_extend(): for i in xrange(Time): array = [] for j in xrange(N): array.extend([1]) def list_extend_list(): for i in xrange(Time): array = [] array.extend(range(N)) def list_intend(): for i in xrange(Time): [1 for i in xrange(N)] if __name__ == '__main__': array= [list_append,list_extend,list_extend_list,list_intend] time.time() for function in array: clock = time.time() function() print (time.time() - clock) / Time
実験結果
実験関数 | 速度 |
append | 0.865309405327 |
extend(1つずつ) | 1.87617440224 |
extend(リスト) | 0.265864300728 |
リスト内包表記 | 0.399292898178 |
考察
extendの一つずつが凄く遅い、逆にextend(リスト)が最も早く
ソースコードを記述する時にリストの長さを意識してappendやextendを利用する必要性は十分にある。
安定して高速なのがリスト内包表記ですが、なんかPythonっぽくてかっこいいですね。
まぁappendが遅いのはきっとコピーして作り直してるのだろうけど・・・・