のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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が遅いのはきっとコピーして作り直してるのだろうけど・・・・