32ビットPythonに対する64ビットPythonの利点は何ですか?


ベストアンサー

**まず最初に**:

64ビットPythonは64ビットシステムにのみインストールでき、64ビットコンピューターにのみインストールできます。

** 2番目のこと:**

コンピューター/プログラムがnビットであると言っても、nサイズの変数を使用するという意味ではありません。最大2 ^ nのメモリチャンク(通常はバイト)をアドレス指定できます。これが、WindowsXPまたはその他の32ビットオペレーティングシステムが約3.5GBを超えるRAMを使用できない理由です。計算してみましょう。32ビットです。バイナリビットなので、最大2 ^ 32バイトをアドレス指定できます。 2 ^ 32 = 4294967296 [バイト] = 4096 [MB] = 4 [GB]。ご覧のとおり、理論的にはシステムは最大4GBのRAMに対応する必要があります。約0.5 [GB]のこの「欠落」部分は、PCI(AGP、USBなど)デバイスのメモリをアドレス指定するために使用されます。 64ビットシステムでは、最大16777216 [TB]のメモリをアドレス指定できます。かなりかっこいいですね。

** tl; dr **

プログラムは32ビットインスタンスで実行されます。 Pythonは最大(理想的には)4 [GB]のメモリを使用できます。これは通常は十分ですが、問題が発生する場合もあります。一方、Pythonの64ビットインスタンス(プログラムもPythonで実行されるため)は、無制限*のメモリをアドレス指定して使用できます。これは素晴らしいことです。しかし、繰り返しになりますが、Adam Jorgensenの答え:32ビットと64ビットのPythonで実行された同じプログラムは、約4 [GB]未満である限り、同じ量のメモリを使用します。64ビットでは遅くなりません。 Pythonも。

*完全に正しいわけではありません。興味がある場合は2番目のことを参照してください。

お役に立てば幸いです。 🙂

回答

あなたの質問は何が起こっているのか理解が不足していることを示しているので、私はこれについてすべて詳細に話す時間を取ります。

最初の行にfor loop in range(1, 11).と記述します。名前loopはまったく意味がありません。構造全体が1つのループです。つまり、1から10までの数字を1回だけループします。書いた内容では、10回ループしているように見えますが、これは正しくありません。したがって、コードは正しいものの、変数の名前は理解が不足していることを示しています。何が起こっているのか。

for number in range(1, 11):

print(number)

その全体(2行のコード)はfor loopです。1つのfor loop

私はしません。いくつかの理由から、whileループで何を達成したいかを理解してください。まず、すべての数値を反復処理し、各数値の後にループから抜け出すオプションをユーザーに提供する場合は、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

range(1, 11)の印刷をlist()でラップすることで修正できますが、それでも希望どおりではないようです。 forループと同じこと、つまり各数値を印刷したいが、各数値の後にループから抜け出すオプションを与えたいと思います。それ以外の場合は、同じことを何度も印刷するためにループがあるのはなぜですか。もう一度?

forループを使用したくない場合は、次のようなものを使用できます:

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

または

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

iterrange(1, 11)ではありません イテレータですが反復可能。これは、イテレータを生成できるオブジェクトを意味します。これは非常に微妙ですが重要な違いです。 listはイテレータですが、イテレータではありません。イテレータは状態を保持します。つまり、次に生成する値を記憶しています。リストではそれを行うことはできませんが、リストをイテレータに変えることはできます。

例:

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

「内部」でどのように機能するかを知りたい場合は、次の例を見てみましょう。

>>> 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は、状態を保持しているため、イテレーターです(いわば、現在の場所を記憶しています)。具体的には、\_\_next\_\_()メソッドが定義されています。それはいつでも次の値を生み出すことができます。また、\_\_iter\_\_( )があるため、反復可能です。メソッドが定義されています。

ジェネレーターは、値を遅延生成するイテレーターです。例:

def counter(current=1):

while True:

yield current

current += 1

はい、ジェネレーターには次のような状態があります。

>>> my\_counter = counter()

>>> next(my\_counter)

1

>>> next(my\_counter)

2

>>> next(my\_counter)

3

今興味深いのは、rangeではなく ジェネレーター、一般的な信念に反します。 range反復可能ですが、イテレータではありません。 span>であるため、ジェネレーターではありません。これは煩わしいように思われるかもしれませんが、これにはいくつかの正当な理由があります(startstop、、不変性(変更できません。状態を保持するためには、可変である必要があります))もちろん、rangeをとして実装することは可能です。ジェネレーター:

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

... current = start

... while current < stop:

... yield current

... current += step

...

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

>>> list(test\_range)

[1, 3, 5, 7, 9]

問題を単に修正するのではなく、問題を理解し始めるのに十分な背景を与えていただければ幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です