Overfor MemoryError i Python

Jeg skrev et program for at finde hovedfaktorer for et tal. Når jeg giver et stort antal (600851475143) som input, vises MemoryError. 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 browsing lærte jeg, at Python bruger computerhukommelse – RAM. Jeg bruger Python i Unbuntu uden at ændre dens konfiguration. Skal jeg ændre noget til at arbejde på 64-bit maskine. Eller skal jeg bruge en eller flere yderligere funktioner til at omgå denne fejl

Kommentarer

  • Dit grundlæggende problem er, at din algoritme sandsynligvis bruger for meget hukommelse. Hvis du bruger python 2, forsøger range(1, a+1) at oprette en liste med 600851475143 elementer. Dette er sandsynligvis ikke, hvad du vil, da hvert element vil være et heltal, og hvert heltal tager 4 byte. (Dette spørgsmål er ikke ' t passende for programmører, da du virkelig har brug for en kodegennemgang og især for at forstå, hvordan python fungerer.)
  • (Du vil sandsynligvis have xrange, som er en generator, der returnerer elementer til for -sløjfen efter behov. Det er dog ikke det eneste problem, du har .)
  • Din liste er 2,2 TB stor. Det kan ikke hjælpe at skifte til en 64-bit maskine. Du skal installere mere end 2 TB RAM (hvilket for at være retfærdigt kræver et 64 bit OS at bruge). Eller tænk igen om din algoritme.
  • Ud over hukommelsesproblemer (bare fordi ingen hidtil har påpeget), er der nogle mere effektive algoritmer til beregning af listen over faktorer for et tal eller for at beslutte om et tal er primtal eller for at generere en liste med primtal. Mens de fleste mennesker taler om tidskompleksitet , er der også det relaterede begreb rumkompleksitet .

Svar

Der er forskellige måder at måle den hukommelse, der bruges af dit program, og du kan muligvis øge grænser pr. bruger eller noget.

Du behøver dog ikke allokere den hukommelse i første omgang, da du bare kan generere sekvensen uden at gemme 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) 

Bemærk, at du også kan gentage direkte over sekvenser uden at skulle indeksere dem gentagne gange:

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

Kommentarer

  • Listen i spørgsmålet er 2,2 TB stor, jeg tvivler på at hæve ressourcegrænser vil hjælpe 😀
  • Nå, måske kan OP vente til 2035, når 8 TB SIMMS er tilgængelige.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *