2015-09-26 93 views
1

我想从0迭代到sys.maxint,但得到'MemoryError'。我该如何做这件事?如何在Python中使用for循环从0迭代到sys.maxint

这是简单的代码片段。

for i in range(sys.maxint): 
    a = 1 

ERROR:回溯(最近最后一次通话): 文件 “”,1号线,在 的MemoryError

+4

。它支持迭代直到CPython中的'sys.maxint'。 –

+2

使用'xrange'(或切换到python3)。 – ekhumoro

+0

非常感谢。 – Adarsh

回答

10

在Python 2,范围关键字构造包含在范围内的所有数字的列表,你指定。所以如果你想创建一个高达2**31-1的范围,它必须为4*(2**31-1)字节(大约8.5Gb)分配空间。你可能没有那么多的内存。

2**31-1假定您使用的是32位python。用64位python,maxint是2**63-1。你肯定不要有那么多公羊(8*(2**63-1) =约7300万Tb)。

如果你想在Python 2中对一组数字进行范围测试,并且不想提前构造这些数字的完整列表(并且因此使用那么多的RAM),你可以使用xrange而不是range。语义是相同的,但它返回一个惰性迭代器而不是列表。

即使您确实使用xrange,它仍然需要永远计数到2**63-1,但这是一个不同的问题,并且如果您计划早于此时打破for循环,则可能无关紧要。在应用程序开发过程中请注意这一点。

最后一点,在Python 3,xrange跑了,range是构建一个懒惰的迭代器的功能。要在Python 2中获得相当于range的效果,您可以使用[`xrange()`](https://docs.python.org/2/library/functions.html#xrange)'list(range(v))