Şu anda Project Euler'daki problemler üzerinde çalışıyorum ve şu ana kadar bir sorun için bu kod ile geldim. Bunu çalıştırdığınızdaBu bellek hatasını önlemek için bir yol var mı?
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
Ben MemoryError
içine çalıştırın.
geri izleme: Ben Google'dan ama boşuna almak mümkün oldum ne çöp toplama devre dışı bırakarak bunu önlemek için çalıştık
File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)
. Buna yanlış yoldan mı yaklaşıyorum? Kafamda, bunu yapmanın en doğal yolu gibi hissettiriyor ve bu noktada bir kayıp yaşıyorum.
YAN NOT: PyPy 2.0 Beta2'yi (Python 2.7.4) kullanıyorum çünkü kullandığım diğer tüm python uygulamalarından çok daha hızlı ve Scipy/Numpy başımın üstündeymiş gibi. programlamaya başlıyor ve mühendislik ya da güçlü bir matematik altyapım yok.
Ne kadar bellek var? sistem 64 bit mi? – Ofiris
64-bit, 8 GB bellek, PyPy 32 bit olmasına rağmen, bu da bir fark yaratır. –
Bir yerde bir hata var gibi görünüyor. Eğer findanumlar çalıştıktan sonra len (anums) yazdıysanız, 28123 değerini verir, yani bir sayıdan 28123'e kadar olan sayı, bol miktardadır. Bunun doğru olduğunu düşünmüyorum. – Kevin