Jag skrev ett program för att hitta huvudfaktorer för ett tal. När jag anger ett stort antal (600851475143) som inmatning dyker MemoryError
upp. Nedan följer 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]
Efter att jag bläddrat fick jag veta att Python använder datorminne – RAM. Jag använder Python i Unbuntu utan att ändra dess konfiguration. Ska jag ändra något till att arbeta på 64-bitars maskin. Eller ska jag använda några ytterligare funktioner för att komma runt detta fel
Kommentarer
Svar
Det finns olika sätt att mäta minnet som används av ditt program, och du kanske kan öka per användare-gränser eller något.
Du behöver dock inte tilldela minnet i första hand, eftersom du bara kan generera sekvensen utan att lagra allt:
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)
Observera att du också kan itera direkt över sekvenser utan att behöva indexera dem upprepade gånger:
for b in fact(long(num)): print b
Kommentarer
- Listan i frågan är 2,2 TB stor, jag tvivlar på att höjda resursgränser kommer att hjälpa 😀
- Tja, kanske OP kan vänta till 2035, när 8 TB SIM-kort finns tillgängliga.
range(1, a+1)
att skapa en lista med 600851475143 element. Detta är förmodligen inte vad du vill eftersom varje element kommer att vara ett heltal och varje heltal tar 4 byte. (Den här frågan är inte ' t lämplig för programmerare eftersom du verkligen behöver en kodgranskning och särskilt förstå hur python fungerar.)xrange
, som är en generator som returnerar element tillfor
-slingan efter behov. Det kan dock inte vara det enda problemet du har .)