Jakie są zalety 64-bitowego Pythona w porównaniu z 32-bitowym Pythonem?

Najlepsza odpowiedź

** Pierwsza sprawa **:

64-bitowy Python można zainstalować tylko w 64-bitowym systemie, który można zainstalować tylko na komputerze 64-bitowym.

** Druga sprawa: **

Powiedzenie, że komputer / program jest n-bitowy, nie oznacza, że ​​używa on zmiennych o rozmiarze n. Oznacza to, że może zaadresować do 2 ^ n fragmentów pamięci (zwykle bajtów). Dlatego Windows XP lub inny 32-bitowy system operacyjny nie może użyć więcej niż około 3,5 GB pamięci RAM. Obliczmy to: mamy 32 binarne, więc możemy zaadresować do 2 ^ 32 bajtów. 2 ^ 32 = 4294967296 [bajty] = 4096 [MB] = 4 [GB]. Jak widać, teoretycznie system powinien adresować do 4 GB pamięci RAM. Ta „brakująca” część około 0,5 [GB] jest używana do adresowania pamięci urządzeń PCI (AGP, USB itp.). W systemie 64-bitowym możemy zaadresować do 16777216 [TB] pamięci. Całkiem fajnie, co?

** tl; dr **

Programy działają z 32-bitową instancją python mógłby wykorzystać do (idealnie) 4 [GB] pamięci, co zwykle wystarcza, ale czasami może powodować problemy. Z drugiej strony, 64-bitowa instancja języka Python (więc programy też z nią działają) może adresować i wykorzystywać nieograniczoną * ilość pamięci, co jest miłe. Ale znowu, zgodnie z odpowiedzią Adama Jorgensena: ten sam program uruchomiony na 32- i 64-bitowym Pythonie będzie używał tej samej ilości pamięci, o ile będzie mniej niż około 4 [GB]. Nie byłby wolniejszy na 64-bitowym Python też.

* to nie jest do końca prawda. Zobacz Druga sprawa, jeśli jesteś zainteresowany.

Mam nadzieję, że to pomoże. 🙂

Odpowiedź

Twoje pytanie wskazuje na brak zrozumienia tego, co się dzieje, więc poświęcę trochę czasu, aby omówić to szczegółowo.

W pierwszym wierszu piszesz for loop in range(1, 11). Nazwa loop w ogóle nie ma sensu. Cała konstrukcja to jedna pętla , tzn. wykonujesz pętlę tylko raz przez liczby od 1 do 10. To, co napisałeś, sprawia wrażenie, jakbyś wykonał pętlę 10 razy, co nie jest prawdą. Więc chociaż twój kod jest poprawny, nazwa zmiennej wskazuje na brak zrozumienia co się dzieje.

for number in range(1, 11):

print(number)

Cała ta rzecz (te dwie pełne linie kodu) to for loop. Jeden for loop.

Nie ” Nie rozumiem, co chcesz osiągnąć za pomocą pętli while z kilku powodów. Po pierwsze, jeśli chcesz iterować przez wszystkie liczby i dać użytkownikowi opcję wyjścia z pętli po każdej liczbie, możesz to po prostu zrobić za pomocą pętli for.

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

Możesz naprawić drukowanie range(1, 11), opakowując go w list(), ale to nadal nie jest tym, czego chcesz. Zakładam, że chcesz zrobić to samo, co w pętli for, a mianowicie wydrukować każdą liczbę, ale dając opcję wyjścia z pętli po każdej liczbie. Dlaczego miałbyś mieć pętlę w przeciwnym razie, aby drukować to samo w kółko ponownie?

Jeśli nie chcesz używać pętli for, możesz użyć czegoś takiego:

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

lub

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

Zwróć uwagę na użycie iter. range(1, 11) nie jest iteratorem , ale iterowalny , czyli obiekt, który może utworzyć iterator . To bardzo subtelne, ale ważne rozróżnienie. Element list jest iterowalny, ale nie jest iteratorem. Iterator przechowuje stan, co oznacza, że ​​pamięta, którą wartość wygenerować jako następną. Nie możesz tego zrobić z listą, ale możesz zmienić listę w iterator.

Na przykład:

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

Jeśli chcesz wiedzieć, jak to działa„ pod maską ”, spójrzmy na następujące przykłady:

>>> 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 jest iteratorem , ponieważ przechowuje stan (że tak powiem, pamięta, gdzie się znajduje). W szczególności ma zdefiniowaną metodę \_\_next\_\_(). W dowolnym momencie może wygenerować następną wartość. Jest również iterowalny , ponieważ ma \_\_iter\_\_( ) zdefiniowana metoda.

Generator to iterator, który leniwie tworzy wartości, na przykład:

def counter(current=1):

while True:

yield current

current += 1

I tak, generatory mają więc stan:

>>> my\_counter = counter()

>>> next(my\_counter)

1

>>> next(my\_counter)

2

>>> next(my\_counter)

3

Teraz interesujące jest to, że range to nie a generator , wbrew powszechnemu przekonaniu. range to iterowalny , ale nie iterator , a więc zdecydowanie nie jest generatorem . Może się to wydawać irytujące, ale jest ku temu kilka dobrych powodów (dodatkowe atrybuty, takie jak start, stop i step, niezmienność (nie można” zmienić; aby coś utrzymywało stan, musi być zmienne)). Oczywiście można zaimplementować range jako generator:

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

Mam nadzieję, że podałem wystarczająco dużo informacji, aby zacząć rozumieć Twój problem, a nie tylko go naprawiać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *