python: 我可以扩展range()方法的上限吗?
range()函数的上限是什么?我该如何扩展它,或者说有什么更好的方法来做到这一点:
for i in range(1,600851475143):
5 个回答
2
pts的回答让我看到了xrange在Python文档中的说明:
注意
xrange()的设计目标是简单和快速。为了实现这个目标,可能会对使用方式有一些限制。Python的C语言实现对所有参数都有要求,必须是C语言的长整型(也就是“短”Python整数),而且还要求元素的数量要能放进一个C语言的长整型里。如果需要更大的范围,可以使用itertools模块中的另一种方法来实现:
islice(count(start, step), (stop-start+step-1)//step)
看起来这是C语言实现的Python特有的限制。
2
你有没有想过直接这样做呢?或者说你有特别的理由需要用到 range()
吗?
x = 1
while x < 600851475143:
// some code
x += 1
10
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