Jeg skrev et program for å finne hovedfaktorer for et tall. Når jeg gir et stort tall (600851475143) som input, dukker MemoryError
opp. Nedenfor er koden:
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]
Fra surfing ble jeg kjent med at Python bruker dataminne – RAM. Jeg bruker Python i Unbuntu uten å endre konfigurasjonen. Skal jeg endre noe til å jobbe på 64-bits maskin. Eller bør jeg bruke noen ekstra funksjoner for å omgå denne feilen
Kommentarer
Svar
Det er forskjellige måter å måle minnet som brukes av programmet ditt, og du kan kanskje øke per brukergrenser eller noe.
Du trenger imidlertid ikke å tildele det minnet i utgangspunktet, siden du bare kan generere sekvensen uten å lagre det hele:
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)
Merk at du også kan gjenta direkte over sekvenser uten å måtte indeksere dem gjentatte ganger:
for b in fact(long(num)): print b
Kommentarer
- Listen i spørsmålet er 2,2 TB stor, jeg tviler på at det å øke ressursgrensene vil hjelpe 😀
- Vel, kanskje OP kan vente til 2035, når 8 TB SIMMS er tilgjengelig.
range(1, a+1)
å lage en liste med 600851475143 elementer. Dette er sannsynligvis ikke det du vil ha, da hvert element vil være et helt tall, og hvert heltall tar 4 byte. (Dette spørsmålet er ikke ' t passende for programmerere, da du virkelig trenger en kodegjennomgang og for å forstå spesielt hvordan python fungerer.)xrange
, som er en generator som returnerer elementer tilfor
sløyfen etter behov. Det er kanskje ikke det eneste problemet du har, skjønt .)