我有以下任务:
编写一个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
答案 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中,range
和xrange
都不会产生长于sys.maxint
的序列(这是系统的long int
最大值)。
因此,完成作业的唯一方法是“#”;&#39;&#39;是用64位Python运行它。
所有其他方式(嵌套循环,自定义迭代器,多个循环等)是不同的工作负载,并且会给出不同的时间。你所能做的就是得到一些近似值一个&#34;真正的&#34;循环将采取。 (例如,计算解释器平均需要多长时间来设置一个循环&#34;然后用这个总计数运行几个循环并减去额外的设置时间)
因此,您必须咨询您的导师(或任何给您任务的人)并确认解决方法是否是可接受的解决方案。或者他们可能只允许你使用较小的数字。