Python
Python3

Pythonの内包表記のスピードについて

More than 1 year has passed since last update.


Pythonの内包表記の書き方とそのスピードについて

内包表記自体の速さについてはこちらを参照

Pythonのリスト内包表記の速度 - Qiita

例えばこういう長さがNのリストがあったとします。

N = 10**8

foo = [None for i in range(N)]

新たにfooと同じ長さのリストを作るときに、

こうやって書くのか

bar = [None for _ in range(len(foo))]

それともこうやって書くのか

bar = [None for _ in foo]

好みの話です

ちょっと内包表記とは違いますが中身がすべて同じものに限って言えばこういう書き方もできますね。

bar = [None] * len(foo)


可読性について

barの長さはfooと同じだよってメッセージがコードから伝わってくるのはrange(len(foo))のような気がします。


速いのはどちらなのか

比べてみましょう


import time

n = 10**8
foo = [None for _ in range(n)]

begin = time.monotonic()
bar = [None for _ in range(len(foo))]
end = time.monotonic()
print('len version {}'.format(end - begin))

begin = time.monotonic()
bar = [None for _ in foo]
end = time.monotonic()
print('iter version {}'.format(end - begin))

begin = time.monotonic()
bar = [None] * len(foo)
end = time.monotonic()
print('* version {}'.format(end - begin))


結果

len version 2.118436049000593

iter version 1.4381394569936674
* version 0.32011151099868584

rangelenで括らないのほうが1.5倍くらい速いみたいです。

len(foo)の部分が時間かかってるんでしょうか。

空のリストとか作るときなら[]*の書き方が速くて良さそうです。

他にもこんな書き方あるよっていう人がいたら教えてください。