对于迭代次数多于sys.maxint的循环

时间:2016-05-30 13:39:32

标签: python python-2.7 for-loop range

我有以下任务:

  

编写一个Python2函数,它打印Python解释器需要循环的时间范围从0到4000000000,在一个for循环中有一个空体

我如何解决这个问题,我的sys.maxint仅为2147483647?

>>> range(4000000000)
OverflowError: range() result has too many items

>>> xrange(4000000000)
OverflowError: Python int too large to convert C long

我使用Windows 7 64位和python 2.7.10

5 个答案:

答案 0 :(得分:2)

您可以使用带有while循环的生成器函数:

def my_range(n):
    i = 0
    while i < n:
        yield i
        i += 1   # will cast to long at some point, but still work
    return

for x in my_range(4000000000):
    pass
使用xrange和负整数的

更新:解决方案不起作用!

答案 1 :(得分:2)

Python 2 中使用大量range()是一个坏主意。我不在乎sys.maxint。它只会超过您的电脑内存。

xrange()是更好的解决方案。但xrange在C中实现,并且要求其参数适合C long。

C long的范围是:-2^31+1 to +2^31-1 (-2147483647 to 2147483647)

4000000000  - 2147483647 = 1852516353

您可以像使用Martijn here的答案一样使用itertools.count()。它像xrange一样,但是在Python中实现。 count()返回一个无穷大迭代器。所以你需要islice来阻止它。

from itertools import islice, count
for i in islice(count(0), 4000000000):
    print i

答案 2 :(得分:1)

我认为该任务旨在让您了解xrange做什么以及iterators是什么。来自documentation

  

此函数与range()非常相似,但返回一个xrange对象   而不是列表。这是一个不透明的序列类型,产生了   与相应列表相同的值,而不实际存储它们   同时。 xrange()在range()上的优势很小   (因为xrange()在被要求时仍然需要创建值)   除非在内存饥饿的机器上使用非常大的范围或   当从不使用所有范围的元素时(例如循环时)   通常以休息终止)。有关xrange的更多信息   对象,请参阅XRange类型和序列类型str,unicode,list,   元组,bytearray,缓冲区,xrange。

实际上,尝试编写for循环而不是直接使用它:

for i in range(.....):
    pass

对战:

for i in xrange(.....):
    pass

看看会发生什么。

答案 3 :(得分:0)

如果你可以使用嵌套的 for循环,这样的东西可能会有效:

for i in xrange(200000):
    for j in xrange(20000):
        pass

答案 4 :(得分:0)

正如您所看到的,在Python 2中,rangexrange都不会产生长于sys.maxint的序列(这是系统的long int最大值)。

因此,完成作业的唯一方法是“#”;&#39;&#39;是用64位Python运行它。

所有其他方式(嵌套循环,自定义迭代器,多个循环等)是不同的工作负载,并且会给出不同的时间。你所能做的就是得到一些近似值一个&#34;真正的&#34;循环采取。 (例如,计算解释器平均需要多长时间来设置一个循环&#34;然后用这个总计数运行几个循环并减去额外的设置时间)

因此,您必须咨询您的导师(或任何给您任务的人)并确认解决方法是否是可接受的解决方案。或者他们可能只允许你使用较小的数字。