りすとせいせいについて
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の方法を扱えるようにした方がいい。
次回はリスト内包的記述について書こう。
-
今回は環境設定が面倒だったので、こちらのpaiza.ioを利用した。https://paiza.io/projects↩