我目前正在解决 Project Euler 上的问题,到目前为止,我已经想出了这个代码来解决问题。
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)
我试图通过禁用我从谷歌获得的垃圾收集来阻止它,但无济于事。我是以错误的方式接近这个吗?在我看来,这感觉是最自然的方式,我现在不知所措。
旁注:我正在使用 PyPy 2.0 Beta2(Python 2.7.4),因为它比我使用过的任何其他 python 实现都快得多,而且 Scipy/Numpy 已经超出了我的想象,因为我还刚刚开始编程和我没有工程学或强大的数学背景。