range()
そしてxrange()
10桁の数字のために働きます。しかし、13桁の数字はどうですか?フォーラムには何も見つかりませんでした。
9 に答える
あなたはこれを試すことができます。範囲と同じセマンティクス:
import operator
def lrange(num1, num2 = None, step = 1):
op = operator.__lt__
if num2 is None:
num1, num2 = 0, num1
if num2 < num1:
if step > 0:
num1 = num2
op = operator.__gt__
elif step < 0:
num1 = num2
while op(num1, num2):
yield num1
num1 += step
>>> list(lrange(138264128374162347812634134, 138264128374162347812634140))
[138264128374162347812634134L, 138264128374162347812634135L, 138264128374162347812634136L, 138264128374162347812634137L, 138264128374162347812634138L, 138264128374162347812634139L]
別の解決策は、のドキュメントitertools.islice
で提案されているように、を使用することです。xrange
整数を列挙する必要がある場合は、itertoolsを使用してみてください。
itertools.count(1000000000000)
1000000000000
要素のリストにメモリを割り当てるべきではありません
10**13 個の要素を必要としない限り、範囲の作成に問題はありません。
range(10**14,10**15,10**14)
与える
[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
64 ビット Python の場合:
>>> xrange(9999999999999)
xrange(9999999999999)
range()
13 桁の数字には使用しません。私の貧弱なマシンでは、結果のリストを保持できません。
うまくいかないと思います。のような関数len
は、cPython 実装の制限により、結果が 4 バイトの整数に収まることを期待しています。
Python 3.0 では:
>>> range(9999999999999)
range(0, 9999999999999)
効きそうだけど…
>>> len(range(9999999999999))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
len(range(9999999999999))
OverflowError: Python int too large to convert to C ssize_t
関連する質問については、こちらを参照してください。
range(x) はリストを返します。Python リストには多くの要素を含めることはできません。何兆ものサイクルを実行する必要がある場合は、xrange() を使用してこれらの数字を反復処理する必要があります。
range() と xrange() は、最近の十分なバージョンの Python で動作します。ただし、2.5 以下では、int から long への変換を回避する必要があります。
def irange(start, stop=None, step=1):
if stop is None:
stop = long(start)
num = 1L
else:
stop = long(stop)
num = long(start)
step = long(step)
while num < stop:
yield num
num += step
これは完全な解決策ではありません (負のステップは処理しません) が、うまくいくはずです。
range()とxrange()の違いは、最初の値はリスト全体を返し、2番目の値は必要に応じて各数値を生成するジェネレーターを返すことです。2つ目は、いくら大きくても、任意の数で機能するはずです。
Python 3.0では、xrange()はなくなり、range()は以前のxrange()と同じように動作します。