2011-05-30 36 views
3

今天我用64000000個條目編寫了一個使用數組/列表的程序。但是,在使用Python編寫sigma=[1]*64000000時,它運行良好,但隨後在程序計算時,我的Ubuntu凍結 - 沒有任何對輸入的反應,甚至沒有鼠標移動。我試了兩次,結果是一樣的。Python中大型列表的內存管理

在C++中實現時,long long sigma[64000000]可以保持良好並且運行速度非常快。

是否有任何理由讓我的程序在運行過程中凍結,除了開始崩潰?

編輯:要回復下面的克里斯,我的代碼沒有凍結,直到後來幾圈。

謝謝大家!

對於那些誰希望看到的代碼,這是程序,蠻力項目歐拉211:

def e211(): 
ans=0 
sigma=[1]*64000000 
for i in range(2,64000000): 
    j=i; 
    if ((j%1000==0) or (j<100)): 
     print(j) 
    q=i*i 
    while j<64000000: 
     sigma[j]+=q 
     j+=i 
for i in range(1,64000000): 
    j=int(sqrt(sigma[i])) 
    if j*j==sigma[i]: 
     ans+=i 
if __name__=='__main__': 
    print(e211()) 
+0

您在C++堆棧上分配了500MB數組? – 2011-05-30 04:52:47

+0

你正在使用哪個版本的python? – 2011-05-30 04:54:14

+0

@Nicholas那麼這是比賽程序員的日常用餐:) – 2011-05-30 04:56:15

回答

7

Python列表是對象列表。 Python中的一個數字本身就是一個對象,所佔用的存儲空間比使用C++代表long long所需的64位要多一些。特別是,Python可以透明地處理大於32位的數字,最終比一個簡單的整數佔用更多的空間。

你可能會發現標準的Python array模塊很有用。它提供了與指定大小的整數統一數組的Python兼容訪問。 (但是,我注意到它不提供64位整數類型。)

+0

所以發生這種情況可能是因爲Python在運行期間更改了int變量的大小,導致內存耗盡? THX :) – 2011-05-30 04:53:14

+0

我不想聽起來像一個白癡,但「標準的Python數組模塊」?我認爲數值數組對於numpy來說是獨一無二的。但是,我再次自己google搜索,發現這個http://docs.python.org/library/array.html。只有找到入口點是荒謬的:D某種程度上,數組([1,2,3],'l')似乎比數組('l',[1,2,3])更容易。 – 2011-05-30 05:05:26

2
range(1,64000000): 

該行創建尺寸6400的完整列表,所以現在你有內存中有兩個這樣大小的列表。改爲使用xrange

+0

謝謝!這對於像我這樣的Python新手來說是新鮮事物,但是,我的程序直到第49和第97循環,分別爲:) – 2011-05-30 04:50:14

+1

範圍的行爲不同於python 2.7到python 3.2。 python 3.2中的範圍是2.7的xrange的擴展版本。 – 2011-05-30 04:52:17

+0

啊,但是如果我把手指放在我的耳朵裏,並且喊出「我的舊代碼總是能工作!Lalalalala!」,那麼它就不可能成爲python 3。 – 2011-05-30 04:53:14