簡體   English   中英

Memory 管理Python中的大列表

[英]Memory management of large lists in Python

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

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

除了在開始時崩潰之外,我的程序是否有任何原因會在運行過程中凍結?

編輯:要在下面回復 Chris,我的代碼直到幾個循環后才凍結。

謝謝你們!

對於那些有興趣查看代碼的人來說,這是一個程序,一個蠻力的 Project Euler 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())

Python 列表是對象列表。 Python 中的數字本身就是 object,它占用的存儲空間比在 C++ 中表示long long所需的 64 位要多。 特別是,Python 透明地處理大於 32 位的數字,這最終比簡單的 integer 占用更多的空間。

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

range(1,64000000):

這一行創建了一個大小為 64000000 的完整列表,因此現在您在 memory 中有兩個該大小的列表。 請改用xrange

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM