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
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.
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.)xrange
, che è un generatore che restituisce elementi al ciclofor
secondo necessità. Potrebbe non essere lunico problema riscontrato, tuttavia .)