[英]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.