Tôi hiện đang làm việc thông qua các vấn đề về Dự án Euler, và cho đến nay tôi đã đưa ra mã này cho một vấn đề.Có cách nào để tránh lỗi bộ nhớ này không?
from itertools import combinations
import time
def findanums(n):
l = []
for i in range(1, n + 1):
s = []
for j in range(1, i):
if i % j == 0:
s.append(j)
if sum(s) > i:
l.append(i)
return l
start = time.time() #start time
limit = 28123
anums = findanums(limit + 1) #abundant numbers (1..limit)
print "done finding abundants", time.time() - start
pairs = combinations(anums, 2)
print "done finding combinations", time.time() - start
sums = map(lambda x: x[0]+x[1], pairs)
print "done finding all possible sums", time.time() - start
print "start main loop"
answer = 0
for i in range(1,limit+1):
if i not in sums:
answer += i
print "ANSWER:",answer
Khi tôi chạy điều này, tôi chạy vào MemoryError
.
Các traceback:
File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)
tôi đã cố gắng để ngăn chặn nó bằng cách tắt thu gom rác thải từ những gì tôi đã có thể nhận được từ Google nhưng không có kết quả. Tôi đang tiếp cận điều này một cách sai lầm? Trong đầu tôi, cảm giác này giống như cách tự nhiên nhất để làm điều đó và tôi đang thua lỗ vào thời điểm này.
SIDE LƯU Ý: Tôi đang sử dụng PyPy 2.0 Beta2 (Python 2.7.4) vì nó nhanh hơn rất nhiều so với bất kỳ triển khai python nào khác mà tôi đã sử dụng và Scipy/Numpy trên đầu vì tôi vẫn chỉ bắt đầu chương trình và tôi không có nền tảng kỹ thuật hoặc toán học mạnh mẽ.
Bạn nhận được bao nhiêu bộ nhớ? hệ thống 64-bit là gì? – Ofiris
64 bit, 8 GB bộ nhớ, mặc dù PyPy là 32 bit nếu điều đó tạo ra sự khác biệt. –
Dường như bạn có lỗi ở đâu đó. Nếu bạn 'in len (anums)' sau khi 'findanums' chạy, nó cho' 28123', có nghĩa là số _every_ từ một đến 28123 là một số phong phú. Tôi không nghĩ điều đó đúng. – Kevin