python:我可以扩展range()方法的上限吗?

时间:2009-05-08 20:10:49

标签: python

range()函数的上限是什么?如何扩展它,或者最好的方法是什么:

for i in range(1,600851475143):

5 个答案:

答案 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):
    ...