ここで試してみましたが、こんな長い数字は印刷できません
for i in range(1,222222222222222):
print i
エラー:
Traceback (most recent call last):
File "x.py", line 1, in <module>
for i in range(1,222222222222222):
MemoryError
ここで試してみましたが、こんな長い数字は印刷できません
for i in range(1,222222222222222):
print i
エラー:
Traceback (most recent call last):
File "x.py", line 1, in <module>
for i in range(1,222222222222222):
MemoryError
を使用し xrange
ます。
for i in xrange(1, 222222222222222):
print i
この関数は range() に非常に似ていますが、リストの代わりに「xrange オブジェクト」を返します。これは、対応するリストと同じ値を生成する不透明なシーケンス型であり、実際にはすべてを同時に格納する必要はありません。
おそらくPython2を使用しており、range()
数値のリストを生成します。222222222222222 個の要素を持つリストは非常に大きく、ほとんどの RAM には大きすぎます。
これとは対照的にxrange()
、リストのようにアクセスできる (インデックス化され、反復される) xrange オブジェクトを生成しますが、値はオンデマンドで計算されるため、それほど多くのスペースを占有しません。
Python3 ではrange()
、2.x の xrange オブジェクトとまったく同じ範囲オブジェクトを返します。
代わりに xrange を使用してください。range 関数は実際にメモリ内にリストを構築しますが、xrange はジェネレータ (イテレータに似ています) を返し、一度に 1 つの数値のみを返します。
for i in xrange(1,222222222222222L):
print i
このトピックの詳細はこちら
Python は、ループを開始する前に範囲を作成するため、大量のメモリ使用/oom エラーが発生します。
xrange を使用したほうがよいでしょう。範囲をより小さな部分に割り当てます。
for i in xrange(from, to):
print i
自分でyield を使用してジェネレーターを作成することもできます。
def my_gen(start, end, step):
while start < end:
start += step
yield start
for x in my_gen(1, 1000, 2):
print x
このWhileループの例を確認してください
a = 0
while a < 10 :
a += 1
print (a)
「Forループ」を使用して同じことを行うこともできます
onetoten = range(1,11)
for count in onetoten:
print (count)