【Python】リストの初期化は[None]*n
Pythonでリストは頻繁に使うと思います。
固定長のリストの初期化は、どの方法が速いのか気になったので検証してみました。
ひとまず結論
list1 = [None] * N
この書き方が速い!(N:リスト長)
速度検証を行う記法
検証対象は以下の3通り
パターン1
list1 = [] for i in range(N): list1.append(None)
pythonを習うと最初にかけるようになるパターンかなと思い、検証パターンに採用した。
十中八九、遅いと思われる噛ませ犬。
パターン2
list2 = [None for _ in range(N) ]
リストの生成は、このワンライナーが最も速いと思っていた。。。
パターン3
list3 = [None] * N
少し前に、この記法を知りました。
速度検証
テストコード
import time # num of elements in list N = 10000000 st = time.time() list1 = [] for i in range(N): list1.append(None) elapsed1 = time.time() - st st = time.time() list2 = [ None for _ in range(N)] elapsed2 = time.time() - st st = time.time() list3 = [None] * N elapsed3 = time.time() - st print("Elapsed (Empty): ", elapsed1, " sec") print("Elapsed (One liner): ", elapsed2, " sec") print("Elapsed (Mul): ", elapsed3, " sec")
結果
パターン | 実行時間[sec] |
---|---|
1 | 0.9249 |
2 | 0.3912 |
3 | 0.0912 |
はい![None] * N
が爆速でした!
まとめ
リストを固定長で初期化するときは、[None] * N
の一択!