range()函数的上限是什么?如何扩展它,或者最好的方法是什么:
for i in range(1,600851475143):
答案 0 :(得分:9)
range(1, 600851475143)
想要在内存中生成一个非常大的列表,并且会出现内存不足错误。要节省内存,请使用xrange
代替range
。不幸的是,xrange
不适用于大数(这是一个实现限制)示例(引发OverflowError):
for i in xrange(1, 600851475143):
print i
如果差异较小,则您的range
区间内可以包含较大的最小值或最大值。例如:
x = 1 << 200
print list(xrange(x, x + 3))
输出:
[1606938044258990275541962092341162602522202993782792835301376L, 1606938044258990275541962092341162602522202993782792835301377L, 1606938044258990275541962092341162602522202993782792835301378L]
原始 for 循环问题的精彩解决方案:
def bigrange(a, b = None):
if b is None:
b = a
a = 0
while a < b:
yield a
a += 1
for i in bigrange(1, 600851475143):
print i
一种不那么花哨的解决方案,即使你在循环体中有continue
也能正常工作:
i = 1 - 1
while i < 600851475143 - 1:
i += 1
print i
答案 1 :(得分:2)
pts的回答让我在xrange python docs中找到了这个:
请注意
xrange()旨在简单明了 快速。实施可能会施加 实现这一目标的限制。 C Python的实现限制了所有 本地C长的论据(“短” Python整数),也需要 元素的数量适合于 原生C长。如果范围更大 需要,替代版本可以 使用itertools模块制作:
islice(count(start, step), (stop-start+step-1)//step)
看起来特别是c python的限制。
答案 2 :(得分:2)
你考虑过这样做吗?或者你有什么理由需要range()
吗?
x = 1
while x < 600851475143:
// some code
x += 1
答案 3 :(得分:0)
这取决于您使用的是哪个版本的Python。我正在使用2.5.2并且xrange会对大数字引发OverflowError异常。一种解决方案是编写自己的生成器。
def g(start, stop):
i = start
while i < stop:
yield i
i += 1
x = 1<<200
for i in g(x, x+3):
print i
答案 4 :(得分:0)
以下是使用itertools
的答案。这有点人为,但它有效:
from itertools import repeat, count, izip
for i,_ in izip(count(1), repeat(1, 600851475143)):
...
另一个答案是编写自己的生成器:
def my_xrange(a, b):
while a < b:
yield a
a += 1
for i in my_xrange(1, 600851475143):
...