2015-09-26 39 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))