rangeとxrange | Python-izm

rangeとxrange

サンプルコードでforとセットでよく使用されるrangeの紹介です。決まった回数の繰り返し処理を行うのに適しており、指定した引数に応じた数の値が戻り値となります。

rangeの基礎

引数に10を指定している下記サンプルでは、0から9までの数値を順次取得することができ、10回ループするfor文となります。

for i in range(10):
    print(i)
0
1
2
3
4
5
6
7
8
9

引数を2つ渡す下記のようなケースでは、2から始まり9(10の一つ前)まで、という値が順次が生成されます。

for i in range(2, 10):
    print(i)
2
3
4
5
6
7
8
9

引数には負の値を渡すことも可能です。

for i in range(-2, 10):
    print(i)
-2
-1
0
1
2
3
4
5
6
7
8
9

xrangeとは

Python 2系ではrangeとxrangeの2種類がありましたが、Python 3系ではrangeのみとなりました。一見するとrangeと全く同じ処理になります。

Python 2系

for i in xrange(10):
    print i
0
1
2
3
4
5
6
7
8
9

何が異なるのかというと、大きな数を指定した時のメモリの効率です。Python 2系におけるrangeは、引数で10を指定した場合、要素を10個持つリストが作られます。これは繰り返し処理を行う前に確保されます(あらかじめ全て用意する)。これに対してxrangeはその都度必要な値を生成します。小さな要素数の場合はあまり変わりませんが、仮に10ではなく「10000000(1千万)」であった場合はどうでしょうか。一息に1千万もの要素をもつリストが作られることと、その都度必要な分だけ値を生成するのではまったく効率が異なります。なお先に述べた通りPython 3系ではxrangeはありません。rangeがxrangeに近い形へ実装し直されたため、撤廃になりました。