rangeとxrangeは何が違うの!?

Pythonの繰り返し処理で出てくる「range」と「xrange」ですが、何が違うかみていきたいと思います!

range

例文で、以下のようなコードをよく目にするかと思います。

for i in range(10):
	print i

rangeがリストを生成して繰り返し処理をする仕組みですが、どのようなデータを生成されるか以下のコードを実行してみるとよくわかります(*´ω`*)b

print range(10)

すると以下のように、、、

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

rangeで指定した範囲の「リスト」を生成しています(*´ω`*)

っということは!!

100万回繰り返そうとすると、100万個の要素を持ったリストがメモリ上に生成されます。非常に大きなリストなので、メモリを大きく圧迫してしまう可能性があります、、、(´・ω・`)

そこで登場するのが、xrangeです!

xrange

xrangeを使う場合は、rangeと特に変わりなく使うことができます。

for i in xrange(10):
	print i

rangeと同様に、printを使ってxrangeの部分だけ見てみます。

print xrange(10)

すると、、、

xrange(10)

何やらrangeと違うものが出力されました! xrangeでは、xrangeオブジェクトと言うものが生成されます。

print type(xrange(10))
<type 'xrange'>

xrangeは、リストを作らずに必要に応じて値を作ってくれます。巨大なリストを作成しないので、メモリを圧迫しないっということですね!(*´ω`*)

ただ、利点は微々たるもので、処理がメチャメチャ早くなるといったことは無いように感じます(;´∀`)

繰り返し処理が、途中でbreakする事が多い場合や、メモリを圧迫するほど重たい処理の場面でxrangeを使うと、効率がいいよー!という感じで使っています(`・ω・´)ゞ