Kirjoitin ohjelman löytämään luvun alkutekijät. Kun annan syötteenä suuren määrän (600851475143), MemoryError
ponnahtaa esiin. Alla on koodi:
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]
Selaamisen aikana sain tietää, että Python käyttää tietokoneen muistia – RAM-muistia. Käytän Pythonia Unbuntussa muuttamatta sen kokoonpanoa. Pitäisikö minun vaihtaa mikä tahansa toimimaan 64-bittisessä koneessa. Vai pitäisikö minun käyttää muita toimintoja kiertääksesi tämän virheen?
Kommentit
vastaus
Ohjelmasi käyttämän muistin mittaamiseen on useita tapoja, ja voit ehkä lisätä käyttäjäkohtaiset rajoitukset tai jotain.
Sinun ei kuitenkaan tarvitse allokoida sitä muistia, koska voit luoda sarjan vain tallentamatta sitä kaikkea:
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)
Huomaa, että voit myös toistaa suoraan sekvenssejä tarvitsematta niitä indeksoida toistuvasti:
for b in fact(long(num)): print b
kommentit
- Kysymyksessä oleva luettelo on 2,2 Tt, epäilen resurssirajojen nostamisesta 😀
- No, kenties OP voi odottaa vuoteen 2035, jolloin 8 Tt: n SIMMS-koodit ovat käytettävissä.
range(1, a+1)
yrittää luoda luettelon 600851475143 elementistä. Tämä ei todennäköisesti ole mitä haluat, koska jokainen elementti on kokonaisluku ja jokainen kokonaisluku vie 4 tavua. (Tämä kysymys ei ole myöskään ' sopiva ohjelmoijille, koska tarvitset todella koodin tarkistuksen ja ymmärrät erityisesti pythonin toiminnan.)xrange
, joka on generaattori, joka palauttaa elementitfor
-silmukkaan tarpeen mukaan. Se ei kuitenkaan välttämättä ole ainoa ongelma, joka sinulla on .)