2 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
糟糕,這是優(yōu)化整數(shù)列表的一個糟糕案例。問題是它以整數(shù)列表開始:
bin2 = [0] * L
這在內(nèi)部存儲為整數(shù)數(shù)組。它通常更緊湊,即使在這種情況下它不會改變?nèi)魏螙|西——因為在 CPython 上它是一個包含L相同 object 副本的列表0。
但問題是很快,我們將 a 存儲long在列表中。此時,我們需要將整個列表變成可以存儲任何內(nèi)容的泛型類型。但!問題是我們看到了 1 億個零,因此我們創(chuàng)建了 1 億個0對象。除了列表本身的 800MB 之外,這會立即產(chǎn)生 3 GB 的內(nèi)存壓力。
如果我們像這樣初始化列表,我們可以檢查問題是否不會發(fā)生,以便它確實包含 1 億次相同的對象:
bin2 = [0L] * L # Python 2.x
bin2[0] = 1
也就是說,在您的示例中,您不需要列表首先包含 1 億個元素。您可以將其初始化為:
bin2 = [1]
并使用bin2.append(). 這讓程序啟動得更快,而且在開始時不會占用大量內(nèi)存。
請注意,PyPy3 仍然比 CPython3 使用更多的內(nèi)存。

TA貢獻1796條經(jīng)驗 獲得超7個贊
AFAICT 這里的問題是您將 long 分配給數(shù)組,盡管您是模數(shù),但 PyPy 似乎沒有注意到該數(shù)字仍然適合機器字。
我可以想到兩種方法來解決這個問題:
通過分配給該值
bin2[n+1]
通過int()
。使用
array.array()
.
前者只影響 PyPy2,并導(dǎo)致在我的 Mac 上似乎穩(wěn)定的內(nèi)存占用為 ~800MB,而后者似乎穩(wěn)定在 ~1.4GB,無論我是在 PyPy2 還是 PyPy3 中運行它。
不過,我還沒有完全運行該程序,所以 YMMV ......
添加回答
舉報