În fața MemoryError în Python

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

  • Problema dvs. de bază este că algoritmul dvs. utilizează probabil prea mult memorie. Dacă utilizați python 2, atunci 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.)
  • (probabil că doriți xrange, care este un generator care returnează elemente la bucla for după cum este necesar. Este posibil să nu fie singura problemă pe care o aveți, deși .)
  • Lista dvs. este de 2,2 TB mare. Trecerea la un computer pe 64 de biți nu va ajuta. Trebuie să instalați mai mult de 2 TB de memorie RAM (ceea ce pentru a fi corect va necesita un sistem de operare pe 64 de biți pentru a fi utilizat). Sau gândiți-vă din nou la algoritmul dvs. dacă un număr este prim sau pentru a genera o listă de numere prime. În timp ce majoritatea oamenilor vorbesc despre complexitatea timpului , există și conceptul conex de complexitatea spațiului .

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *