Obecnie pracuję nad problemami w Projekcie Euler i do tej pory wymyśliłem ten kod dla problemu.Czy istnieje sposób na uniknięcie tego błędu pamięci?
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
Gdy uruchomię to biegnę do MemoryError
.
traceback:
File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)
Próbowałem zapobiec poprzez wyłączenie zbierania śmieci z tego, co udało mi się dostać od Google, ale bezskutecznie. Czy podchodzę do tego w niewłaściwy sposób? W mojej głowie wydaje mi się to najbardziej naturalnym sposobem na zrobienie tego, a ja w tej chwili jestem bezradny.
SIDE UWAGA: Używam PyPy 2.0 Beta2 (Python 2.7.4), ponieważ jest znacznie szybszy niż jakakolwiek inna implementacja Pythona, której używałem, a Scipy/Numpy są nad moją głową, ponieważ wciąż jestem po prostu zaczynają programować i nie mam inżynierii ani silnego tła matematycznego.
Ile pamięci masz? to jest system 64-bitowy? – Ofiris
64-bitowe, 8 GB pamięci, chociaż PyPy ma wartość 32-bitową, jeśli ma również znaczenie. –
Wygląda na to, że masz gdzieś błąd. Jeśli "drukujesz len (anums)" po uruchomieniu 'findanums', to daje' 28123', co oznacza, że _nasta_ liczba od jednego do 28123 jest liczbą mnogą. Nie sądzę, że to prawda. – Kevin