Mitkä ovat 64-bittisen Pythonin edut 32-bittiseen Pythoniin verrattuna?

Paras vastaus

** Ensimmäinen asia **:

64-bittinen Python voidaan asentaa vain 64-bittiseen järjestelmään, joka voidaan asentaa vain 64-bittiseen tietokoneeseen.

** Toinen asia: **

Sanoen, että tietokone / ohjelma on n-bittinen, ei tarkoita, että se käyttää n-kokoisia muuttujia. Se tarkoittaa, että se voi käsitellä enintään 2 ^ n muistipalaa (yleensä tavua). Siksi Windows XP tai mikä tahansa muu 32-bittinen käyttöjärjestelmä ei voi käyttää enempää kuin noin 3,5 Gt RAM-muistia. Laske se ”: Meillä on 32 binaaribittejä, joten voimme kohdistaa enintään 2 ^ 32 tavua. 2 ^ 32 = 4294967296 [tavua] = 4096 [MB] = 4 [GB]. Kuten näette, teoriassa järjestelmän tulisi käsitellä jopa 4 Gt RAM-muistia. Tätä noin 0,5 [Gt: n] ”puuttuvaa” osaa käytetään PCI-laitteiden (AGP, USB jne.) Muistin osoittamiseen. 64-bittisellä järjestelmällä voimme kohdistaa jopa 16777216 [TB] muistia. Melko siistiä, vai mitä?

** tl; dr **

Ohjelmat suoritetaan 32-bittisellä python voisi käyttää jopa (mieluiten) 4 [Gt] muistia, mikä yleensä riittää, mutta joskus voi aiheuttaa ongelmia. Toisaalta 64-bittinen python-esiintymä (joten myös ohjelmat toimivat sen kanssa) voi osoittaa ja käyttää rajoittamatonta * muistin määrää, mikä on mukavaa. Mutta jälleen kerran, Adam Jorgensenin vastaukseen: sama 32- ja 64-bittisellä pythonilla suoritettu ohjelma käyttää yhtä paljon muistia, kunhan se olisi alle noin 4 [Gt]. Se ei olisi hitaampi 64-bittisessä myös python.

* se ei ole täysin totta. Katso Toinen asia, jos olet kiinnostunut.

Toivottavasti se auttaa. 🙂

Vastaus

Kysymyksesi osoittaa, että meneillään ei ole ymmärrystä, joten käytän aikaa puhua tästä kaikesta yksityiskohtaisesti.

Ensimmäiselle riville kirjoitat for loop in range(1, 11). Nimellä loop ei ole mitään järkeä. Koko rakenne on yksi silmukka , ts. silmukkaat vain kerran numeroiden 1-10 läpi. Kirjoittaisi näyttää siltä, ​​että silmukoit 10 kertaa, mikä ei ole totta. Joten vaikka koodisi on oikea, muuttujan nimi osoittaa, että mitä tapahtuu.

for number in range(1, 11):

print(number)

Tuo koko juttu (nuo kaksi koodiriviä) on for loop. Yksi for loop.

En ” Ymmärrä mitä haluat saavuttaa while -silmukalla useista syistä. Ensinnäkin, jos haluat toistaa kaikki numerot ja antaa käyttäjälle mahdollisuuden irtautua silmukasta jokaisen numeron jälkeen, voit tehdä sen yksinkertaisesti for-silmukalla.

for number in range(1, 11):

print(number)

user\_input = input("Do you want to break? (Y/N)")

if user\_input.lower().startswith("y"): #allow for variations and upper/lower case

break

Voit korjata range(1, 11) -tulostuksen käärimällä sen kohtaan list(), mutta se ei silti näytä olevan haluamasi. Oletan, että haluat tehdä saman asian kuin for-silmukassa, nimittäin tulostaa jokaisen numeron, mutta antaa mahdollisuuden irtautua silmukasta jokaisen numeron jälkeen. Miksi sinulla olisi silmukka muuten, tulosta sama asia uudestaan ​​ja uudestaan uudelleen?

Jos et halua käyttää for for -silmukkaa, voit käyttää jotain seuraavista:

current = 1

while True:

print(current)

current += 1

user\_input = input("Do you want to break? (Y/N)")

if user\_input.lower().startswith("y") or current == 10:

break

tai

numbers = iter(range(1, 11))

while True:

current = next(numbers)

print(current)

user\_input = input("Do you want to break? (Y/N)")

if user\_input.lower().startswith("y") or current == 10: #avoid StopIteration

break

Huomaa: iter. range(1, 11) ei ole ei iteraattoria , mutta iterable , eli objekti, joka voi tuottaa iteraattorin . Tämä on hyvin hienovarainen, mutta tärkeä ero. list on iteroituva, mutta ei iteraattori. Iteraattorilla on tila, mikä tarkoittaa, että se muistaa, minkä arvon tuottaa seuraavaksi. Et voi tehdä sitä luettelolla, mutta voit muuttaa luettelon iteraattoriksi.

Esimerkiksi:

>>> my\_list = [1, 2, 3, 4, 5]

>>> my\_list\_iterator = iter(my\_list)

>>> first\_value = next(my\_list\_iterator)

>>>

>>> first\_value

1

>>> second\_value = next(my\_list\_iterator)

>>> second\_value

2

>>> type(my\_list)

>>> type(my\_list\_iterator)

Jos haluat tietää, miten se toimii” konepellin alla ”, tarkastellaan seuraavia esimerkkejä:

>>> class Counter:

... def \_\_init\_\_(self, start=1):

... self.current = start

... def \_\_next\_\_(self):

... value = self.current

... self.current += 1

... return value

... def \_\_iter\_\_(self):

... return self

...

>>> my\_counter = Counter()

>>> next(my\_counter)

1

>>> next(my\_counter)

2

>>> next(my\_counter)

3

my\_counter on iteraattori , koska sillä on tila (se muistaa niin sanotun sijaintinsa). Erityisesti sillä on määritelty menetelmä \_\_next\_\_(). Se voi tuottaa seuraavan arvon missä tahansa vaiheessa. Se on myös iterable , koska sillä on \_\_iter\_\_( ) määritelty menetelmä.

Generaattori on iteraattori, joka tuottaa laiskasti arvoja, esimerkiksi:

def counter(current=1):

while True:

yield current

current += 1

Ja kyllä, generaattoreilla on näin tila:

>>> my\_counter = counter()

>>> next(my\_counter)

1

>>> next(my\_counter)

2

>>> next(my\_counter)

3

Mielenkiintoista on nyt se, että range ei ole ei a generaattori , toisin kuin yleinen käsitys. range on iteroitava , mutta ei iteraattori , eikä siis ehdottomasti generaattoria . Tämä saattaa tuntua ärsyttävältä, mutta siihen on hyviä syitä (ylimääräiset määritteet, kuten start, stop ja step, muuttumattomuus (sitä ei voi muuttaa; jotta jokin pysyisi tilassa, sen on oltava muutettavissa).) range on tietysti mahdollista toteuttaa generaattori:

>>> def my\_range\_generator(start, stop, step=1):

... current = start

... while current

... yield current

... current += step

...

>>> test\_range = my\_range\_generator(1, 11, 2)

>>> list(test\_range)

[1, 3, 5, 7, 9]

Toivon, että olen antanut tarpeeksi taustaa ongelman ymmärtämiseen eikä vain korjaa sitä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *