私は現在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は私の頭の上にあります。プログラムを始めて、私は工学や強い数学の背景を持っていません。
どのくらいのメモリがありますか?システムは64ビットですか? – Ofiris
64ビット、8 GBのメモリですが、違いがある場合はPyPyが32ビットです。 –
あなたはどこかにバグがあるようです。 'findanums'が実行された後に' len(anums) 'を出力すると' 28123'となり、1から28123までの全ての数字が豊富です。私はそれが正しいとは思わない。 – Kevin