Attualmente sto lavorando sui problemi di Project Euler, e finora ho trovato questo codice per un problema.C'è un modo per evitare questo errore di memoria?
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
Quando eseguo questo mi imbatto in un MemoryError
.
Il traceback:
File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)
Ho cercato di impedirlo disabilitando la raccolta dei rifiuti da quello che ho potuto ottenere da Google, ma senza alcun risultato. Mi sto avvicinando a questo nel modo sbagliato? Nella mia testa questo mi sembra il modo più naturale per farlo e sono in perdita a questo punto.
SIDE NOTA: Sto usando PyPy 2.0 Beta2 (Python 2.7.4) perché è molto più veloce di qualsiasi altra implementazione Python che ho usato, e Scipy/Numpy sono sopra la mia testa dato che sono ancora solo inizio a programmare e non ho un background di ingegneria o matematica forte.
Quanto memoria hai? il sistema è a 64 bit? – Ofiris
64-bit, 8 GB di memoria, sebbene PyPy sia a 32 bit se questo fa la differenza. –
Sembra che tu abbia un bug da qualche parte. Se si stampa 'len (anums) 'dopo l'esecuzione di' findanums', esso restituisce' 28123', il numero _every_ da uno a 28123 è un numero abbondante. Non penso sia corretto. – Kevin