Am scris un program pentru a găsi factorii primi ai unui număr. Când dau un număr mare (600851475143) ca intrare, apare MemoryError
. Mai jos este codul:
def fact(a): factors = [] for i in range(1,a+1): if a%i == 0: factors.append(i) return factors num = raw_input(">> ") #600851475143 a = b = [] a = fact(long(num)) for i in range(0,len(a)): b = fact(a[i]) if len(b) <= 2: print a[i]
Din navigare am aflat că Python folosește memoria computerului – RAM. Folosesc Python în Unbuntu fără a-i modifica configurația. Ar trebui să schimb orice pentru a funcționa pe un computer pe 64 de biți. Sau ar trebui să folosesc orice funcție suplimentară pentru a rezolva această eroare
Comentarii
Răspuns
Există diferite moduri de a măsura memoria utilizată de programul dvs. și este posibil să puteți crește limitele per utilizator sau ceva.
Cu toate acestea, nu este necesar să alocați memoria respectivă, deoarece puteți genera secvența fără a o stoca pe toate:
def fact(a): "just return a generator for the sequence you want" return (i for i in xrange(1,a+1) if a % i == 0)
Rețineți că puteți, de asemenea, să iterați direct peste secvențe fără a fi nevoie să le indexați în mod repetat:
for b in fact(long(num)): print b
Comentarii
- Lista din întrebare este de 2,2 TB mare, mă îndoiesc că mărirea limitelor de resurse va ajuta 😀
- Ei bine, poate PO poate aștepta până în 2035, când Sunt disponibile SIMMS de 8 TB.
range(1, a+1)
încearcă să creeze o listă cu 600851475143 elemente. Probabil că nu este ceea ce doriți, deoarece fiecare element va fi un număr întreg și fiecare număr întreg ia 4 octeți. (De asemenea, această întrebare nu este ' t adecvată pentru programatori, întrucât într-adevăr aveți nevoie de o revizuire a codului și pentru a înțelege în special cum funcționează python.)xrange
, care este un generator care returnează elemente la buclafor
după cum este necesar. Este posibil să nu fie singura problemă pe care o aveți, deși .)