Python簡単実験:内包で何倍高速になるか


2016年 12月 21日

100以下の偶数の自然数からなる集合 を考えよう。
Pythonではなく、数学的にはどう表現するであろうか。

{2,4,6,8,...100}
これでも良いのだが、ちょっと…という部分が気になる。これを、内包表記に書き換えると、
{ x | x は自然数で偶数かつx≦100 }
と表記できる。 | の左側に 元を書き、| の右側に条件を書く。

上記は数学での内包の説明である。
内包の英語は comprehension で、本来「理解」という意味なのだが、数学用語としては「内包」というのがある。

Pythonの場合、集合だけではなく、リスト、辞書にも使える。
次のコードは、1から1000万までの数をリストに順番に入れる。
a = []
for i in range(1,10000001):
a.append(i)
これの実行時間を以下のようにして計測した。
>>> import time
>>> a = []
>>> t0 = time.time()
>>> for i in range(1,10000001):
...     a.append(i)
...
>>> time.time() - t0
2.0536093711853027
約2秒かかっている。

次に、同じリストを内包を使って作ってみた。
>>> a = []
>>> t0 = time.time()
>>> a = [i for i in range(1,10000001)]
>>> time.time() - t0
0.3618910312652588
最初の a = [] は、前の測定と同じ条件にするために入れた。

結果は、内包を使うことで、2.05秒が0.36秒になり、5倍以上高速になったようだ。
内包にすることで、短くなり、速度も上がるようなので、内包が使える場合にはどんどん使った方が良さそうだ。

ということで、もっと内包についてネチネチ調べていこう。