りすとせいせいについて

Pythonで0~99の値の入ったリストを作れ、となった時に以下のリスト1~3の記述の内、 どれが正しいか(以下のコードはPython3)

# リスト1
list1 = []
for i in range(N):
    list1.append(i)
    
# リスト2
list2 = []
for j in range(N):
    list2 += [j]

# リスト3
list3 = [i for i in range(N)]

答えはすべて正しい。それぞれ
リスト1はappendメソッドを用いている
リスト2はリストの結合を用いている
リスト3は内包的記述を用いている

と別々の方法を用いて作成している。もちろんこれ以外にも方法はある。
Pythonを学んで一番最初に使うのはリスト1の方法だと思う。
リスト1の方法は可読性があり、使いやすそうではあるが、
個人的にはリスト3の方法をオススメする。
一番の理由は速度が圧倒的に早いから

実際に以下のプログラムを実行して計測すると以下のようになる1

import time as t # 時間計測用のライブラリ

N = 100
# リスト1
Start = t.clock()
list1 = []
for i in range(N):
    list1.append(i)
Finish = t.clock()
print("list1 create time = ",Finish - Start)

# リスト2
Start = t.clock()
list2 = []
for j in range(N):
    list2 += [j]
Finish = t.clock()
print("list2 create time = ",Finish - Start)

# リスト3
Start = t.clock()
list3 = [i for i in range(N)]
Finish = t.clock()
print("list3 create time = ",Finish - Start)

結果

>>python listCreateTime.py
list1 create time =  1.2999999999999123e-05
list2 create time =  1.1000000000000593e-05
list3 create time =  4.9999999999980616e-06
>>

リスト1とリスト2は実行によって多少誤差が生じ、速さが逆転することもあるが
リスト3は圧倒的に違う。
理由としては
リスト1は追加する度にメソッドの呼び出しがあるため
リスト2は追加する度に演算が発生するため

と考えられる。

今回の場合は0~99といった小さいデータだったため、問題ないが
これが深層学習で取り扱うような大きなデータの場合は、
この差は大きい。
学習にも時間が掛かるのにデータを用意するのにも時間のは良くない。
なのでなるべくはリスト3の方法を扱えるようにした方がいい。

次回はリスト内包的記述について書こう。


  1. 今回は環境設定が面倒だったので、こちらのpaiza.ioを利用した。https://paiza.io/projects