昨天又解決了Project Euler我管理bigfor i in range(n)
週期陷入困境。Python:MemoryError vs OverflowError vs instant-system-freeze
我觀察到python
拋出我不同的錯誤,取決於如何爲大的x
變量。
下面是一個mcve例如:
for i in range(x):
pass
其中:
如果
x = 10**20
我得到了一個OverflowError
, 正是:OverflowError: range() result has too many items
。否則,如果
x = 10**15
我有一個MemoryError
。否則,如果
x = 10**9
我得到了一個instant-system-freeze
,我必須硬重置我的電腦。很少,而不是凍結,我的電腦填滿大約5GB的交換,變得非常緩慢。
我試圖理解蟒built-in exception的含義:
-
當算術運算的結果是太大而不能表示觸發。這不能長整數發生[...],並與普通整數,它會返回一個長整型,而不是大多數操作。 [...]
這意味着整數不應拋出此異常;這個異常的原因是
range()
有太多的項目,所以我想這也10**15
將拋出同樣的異常,但我得到了一個不同的... -
時引發的操作內存用完,但情況仍可能獲救(刪除某些對象)。 [...]
哪些對象應該我刪除搶救這種情況呢?它只是退出,這樣的情況不能被救出......
如果它感覺有太多
ram
使用,爲什麼凍結我的電腦用10**9
?
最後,我的問題是:
爲什麼我得到3種不同的結果,只有依賴於存儲在x
變量的值?
注意:
「OverflowError」是因爲CPython使用有符號的size_t來表示序列的長度;它甚至不可能初始化一個具有「2 ** 31」(32位)或「2 ** 63」(64位)或更多元素的「列表」,因爲存儲元素數量的變量不能代表一個很大的數字。 – ShadowRanger
@ShadowRanger是的,你說得對。我有一段時間沒有使用輸入語言,所以我開始忘記基本的...... = o – Gall