Jaké jsou výhody 64bitového Pythonu oproti 32bitovému Pythonu?

Nejlepší odpověď

** První věc **:

64bitový Python lze nainstalovat pouze na 64bitový systém, který lze nainstalovat pouze na 64bitový počítač.

** Druhá věc: **

Říct, že počítač / program je n-bit, neznamená, že používá proměnné velikosti n. To znamená, že dokáže adresovat až 2 ^ n paměťové bloky (obvykle bajty). Proto Windows XP nebo jakýkoli jiný 32bitový operační systém nemůže použít více než přibližně 3,5 GB paměti RAM. Pojďme to vypočítat: máme 32 binární bity, takže můžeme adresovat až 2 ^ 32 bajtů. 2 ^ 32 = 4294967296 [bajty] = 4096 [MB] = 4 [GB]. Jak vidíte, teoreticky by systém měl řešit až 4 GB paměti RAM. Tato „chybějící“ část přibližně 0,5 [GB] se používá k adresování paměti zařízení PCI (AGP, USB atd.). U 64bitového systému můžeme adresovat až 16777216 [TB] paměti. Docela v pohodě, co?

** tl; dr **

Programy běží s 32bitovou instancí python mohl použít až (v ideálním případě) 4 [GB] paměti, což je obvykle dost, ale někdy to může způsobit problémy. Na druhou stranu, 64bitová instance pythonu (takže s ní běží i programy) dokáže adresovat a využívat neomezené * množství paměti, což je hezké. Ale znovu, k odpovědi Adama Jorgensena: stejný program spuštěný na 32 a 64 bitovém pythonu použije stejné množství paměti, pokud by to bylo méně než asi 4 [GB]. Na 64bitových to nebude pomalejší python taky.

* není to úplně pravda. Pokud máte zájem, podívejte se na druhou věc.

Doufám, že to pomůže. 🙂

Odpověď

Vaše otázka ukazuje nedostatek porozumění tomu, co se děje, takže si udělám čas a promluvím si o tom podrobně.

V prvním řádku napíšete for loop in range(1, 11). Název loop nemá vůbec smysl. Celá konstrukce je jedna smyčka , tj. smyčkou procházíte pouze jednou čísly od 1 do 10. To, co jste napsali, vám připadá, jako byste opakovali smyčku 10krát, což není pravda. Takže i když je váš kód správný, název proměnné naznačuje, že o co jde.

for number in range(1, 11):

print(number)

Celá ta věc (ty dva celé řádky kódu) je for loop. Jeden for loop.

Já ne “ Nechápete, čeho chcete ve smyčce while dosáhnout, z mnoha důvodů. Nejprve, pokud chcete iterovat všemi čísly a dát uživateli možnost vymanit se ze smyčky po každém čísle, můžete to jednoduše udělat pomocí smyčky pro.

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

Můžete opravit tisk range(1, 11) zabalením do list(), ale zdá se, že to není to, co chcete. Předpokládám, že chcete dělat to samé jako ve smyčce for, jmenovitě tisk každého čísla, ale možnost po každém čísle se vymanit ze smyčky. Proč byste jinak měli smyčku, tisknout pořád dokola to samé znovu?

Pokud nechcete použít smyčku for, můžete použít něco jako:

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

nebo

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

Všimněte si použití iter. range(1, 11) není není iterátor , ale iterovatelný , což znamená objekt, který může vytvořit iterátor . Jedná se o velmi jemný, ale důležitý rozdíl. list je iterovatelný, ale ne iterátor. Iterátor má stav, což znamená, že si pamatuje, jakou hodnotu má dále produkovat. Nelze to udělat se seznamem, ale ze seznamu můžete udělat iterátor.

Například:

>>> 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)

Pokud chcete vědět, jak to funguje„ pod kapotou “, podívejme se na následující příklady:

>>> 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 je iterátor , protože má stav (pamatuje si, kde je, abych tak řekl). Konkrétně má definovanou metodu \_\_next\_\_(). Může vytvořit další hodnotu v kterémkoli bodě. Je to také iterovatelný , protože má \_\_iter\_\_( ) metoda definována.

Generátor je iterátor, který líně vytváří hodnoty, například:

def counter(current=1):

while True:

yield current

current += 1

A ano, generátory tedy mají stav:

>>> my\_counter = counter()

>>> next(my\_counter)

1

>>> next(my\_counter)

2

>>> next(my\_counter)

3

Co je nyní zajímavé, je to, že range není a generátor , na rozdíl od všeobecného přesvědčení. range je iterovatelný , ale nikoli iterátor , a tedy rozhodně ne generátor . Může se to zdát nepříjemné, ale má to několik dobrých důvodů (další atributy jako start, stop a step, neměnnost (nelze jej změnit; aby něco mělo stát, musí být proměnlivé), je samozřejmě možné implementovat range jako generátor:

>>> 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]

Doufám, že jsem dostal dostatečné zázemí k tomu, abych vašemu problému začal rozumět, a ne jej pouze opravovat.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *