我目前正在通过项目欧拉的问题,到目前为止我已经想出了这个问题的代码。有没有办法避免这种内存错误?
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
当我运行这个我碰到一个MemoryError
。
回溯:
File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)
我试图阻止它从什么我已经能够从谷歌,但无济于事得到禁止垃圾收集。我以错误的方式接近这个吗?在我的脑海里,这感觉就像是最自然的做法,而且我现在处于亏损状态。
SIDE注意:我使用的是PyPy 2.0 Beta2(Python 2.7.4),因为它比我用过的其他Python实现快得多,而且Scipy/Numpy在我头上,因为我仍然只是开始编程,我没有工程或强大的数学背景。
你得到了多少内存?系统是64位的? – Ofiris
64位,8 GB的内存,虽然PyPy是32位的,如果这也有所改变。 –
你似乎有某个地方的错误。如果在'findanums'运行后'打印len(anums)',它会给出'28123',这意味着从1到28123的_every_数字是一个非常丰富的数字。我不认为这是正确的。 – Kevin