Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have 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)の部分が時間かかってるんでしょうか。
空のリストとか作るときなら[]*の書き方が速くて良さそうです。
他にもこんな書き方あるよっていう人がいたら教えてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away