プログラマーの徒然ブログ

プログラミングに関することをはじめ、興味がでたものを雑多に!

【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")

結果

  • 検証環境
    • ASUS ZenBook UX390U (ノートPC)
      • Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
パターン 実行時間[sec]
1 0.9249
2 0.3912
3 0.0912

はい![None] * Nが爆速でした!

まとめ

リストを固定長で初期化するときは、[None] * Nの一択!