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
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.
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.)xrange
, som er en generator, der returnerer elementer tilfor
-sløjfen efter behov. Det er dog ikke det eneste problem, du har .)