Affrontare MemoryError in Python

Ho scritto un programma per trovare i fattori primi di un numero. Quando fornisco un numero elevato (600851475143) come input, viene visualizzato MemoryError. Di seguito il codice:

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] 

Dalla navigazione sono venuto a sapere che Python fa uso della memoria del computer – RAM. Sto usando Python in Unbuntu senza modificare la sua configurazione. Devo cambiare qualcosa per lavorare su una macchina a 64 bit. O dovrei usare qualsiasi funzione aggiuntiva per aggirare questo errore

Commenti

  • Il tuo problema di base è che il tuo algoritmo sta probabilmente usando troppo memoria. Se stai utilizzando python 2, range(1, a+1) sta tentando di creare un elenco con 600851475143 elementi. Questo probabilmente non è ciò che desideri poiché ogni elemento sarà un numero intero e ogni numero intero richiede 4 byte. (Inoltre, questa domanda non è ' appropriata per i programmatori in quanto hai davvero bisogno di una revisione del codice e per capire in particolare come funziona python.)
  • (Probabilmente vorrai xrange, che è un generatore che restituisce elementi al ciclo for secondo necessità. Potrebbe non essere lunico problema riscontrato, tuttavia .)
  • Il tuo elenco è grande 2,2 TB. Il passaggio a una macchina a 64 bit non aiuterà. È necessario installare più di 2 TB di RAM (che ad essere onesti richiederà un sistema operativo a 64 bit per essere utilizzato). Oppure ripensa il tuo algoritmo.
  • Oltre ai problemi di memoria (solo perché nessun altro ha indicato finora), ci sono alcuni algoritmi più efficienti per calcolare lelenco dei fattori di un numero o per decidere se un numero è primo o per generare un elenco di numeri primi. Sebbene la maggior parte delle persone parli di complessità temporale , esiste anche il concetto correlato di complessità spaziale .

Risposta

Ci sono vari modi per misurare la memoria usata dal tuo programma e potresti essere in grado di aumentare limiti per utente o qualcosa del genere.

Tuttavia, non è necessario allocare quella memoria in primo luogo, poiché puoi semplicemente generare la sequenza senza memorizzare tutto:

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) 

Tieni presente che puoi anche iterare direttamente sulle sequenze senza doverle indicizzare ripetutamente:

for b in fact(long(num)): print b 

Commenti

  • Lelenco nella domanda è grande 2,2 TB, dubito che aumentare i limiti delle risorse aiuterà 😀
  • Beh, forse lOP può aspettare fino al 2035, quando Sono disponibili SIMM da 8 TB.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *