Pythonはintとlongをどのように管理しますか?


118

Pythonが内部でint型とlong型をどのように管理するか知っている人はいますか?

  • 適切なタイプを動的に選択しますか?
  • intの制限は何ですか?
  • Python 2.6を使用していますが、以前のバージョンとは異なりますか?

以下のコードをどのように理解すればよいですか?

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

更新:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>

それらはCPythonでそのままオンザフライでstdc型にマップしませんか?
エイデンベル

ええ、そうだと思います。また、すべてがヒープに割り当てられているのではないかと思います。そのため、数値がより高い精度を必要とする場合、問題はありませreallocん。でも、よくわからないので、答えは誰かに任せます。
zneak 2010年

2
また、pythonでlong変数を使用するように強制することもできますvar = 666L
qba

8
@Ignacio:WRONG A CPythonのはintCであるlong(デフォルトが署名されて)...参照<CPython 2.X source>/Include/intobject.h:typedefは構造体{PyObject_HEAD長いob_ival。} PyIntObject; いずれの場合でも、Python 2.x intでは負の数を使用できます。C unsignedは対応できません。
John Machin 2010年

PEP 237は、Pythonが内部でこれをすべて一見同じようにすることをどのように意図しているのかを説明しています。
Carel

回答:


124

intそしてlong「統一」されたいくつかのバージョンがバックアップ。それ以前は、数学演算を通じてintをオーバーフローさせることが可能でした。

3.xは、長い時間を完全に排除し、intのみを持つことで、これをさらに進化させました。

  • Python 2sys.maxintPython intが保持できる最大値を含みます。
    • 64ビットのPython 2.7では、サイズは24バイトです。に確認してくださいsys.getsizeof()
  • Python 3sys.maxsizePython intで可能な最大サイズ(バイト単位)が含まれます。
    • これは、32ビットでギガバイト、64ビットでエクサバイトになります。
    • このような大きなintは、8の累乗に似た値になりsys.maxsizeます。

30
しかし、Python3は2.xの「long」のように動作しますが、この型を「int」と呼びます。

3
Tedによるコメント:以下で説明するように、maxintよりも大きい値をintにキャストしても、長い>>> type(int(sys.maxint + 1))<type 'long'>
StuartLC

2
sys.maxintは(私の64ビットマシンで)最大の64ビット整数を提供しますa Longは64ビットよりはるかに大きくなる可能性があります。「sys.maxint << 1000000」を試してください
fccoelho

4
python3ではsys.maxsize
pylover

3
sys.maxsizeは整数とは関係ありません。整数の最大サイズがないため、Python 3のsys.maxintは削除されました(Python 3 intはPython 2と同じですlong)。
asmeurer 2014

19

このPEPが役立つはずです。

結論としては、Pythonバージョン> 2.4では心配する必要はありません。


15
intに適合しないもの(つまりlong)を使用してcのint関数を呼び出す必要がある場合は、心配する必要があります。long-> intをキャストしても効果はありません。最近私に起こった。
マッケ2012

1
@Macke:このコメントは私を救いました、私はintがトリックを行うと思いました、そしてなぜ私がまだJython例外を受け取っているのかと思っていました。
2012年

@マッケ絶対にそうだ。私が現在働いている会社では、Tkinterエントリを介してユーザー入力を受け取り、TCP / IPを介してキャストシステムに埋め込まれたシステムを模倣するクライアント(C / C ++で記述)にキャスト値を送信する、Pythonで記述されたシミュレータがあります。Pythonベースのエントリに100000000000000000000000を挿入するとどうなるか想像してみてください...:P
rbaleksandar 2017

@Mackieは、実際にPEPを読みたくなかったとしても、C APIは変更されていません。Cコードでは、shortとlongの違いを認識する必要があります。(Python 3.0 C APIはおそらく完全に互換性がありません。)PyArg_Parse *()APIは、C intまたはlongで表現可能な範囲内にある限り、すでにlong intを受け入れます。そのため、C intまたはlong引数を取る関数は、 Pythonのlongの扱いについて心配する必要があります。
カウバート

4

私のマシンでは:

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

Pythonは、32ビットに適合する値にint(32ビットの符号付き整数、内部でCのintであるかどうかはわかりません)を使用しますが、何でも自動的にlong(任意の多数のビット-つまりbignums)に切り替えます大きい。これにより、bignumへのシームレスな遷移によるオーバーフローを回避しながら、小さい値の速度が上がると思います。


4

面白い。私の64ビット(i7 Ubuntu)ボックス:

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

より大きなマシンで64ビット整数までステップアップすると思います。


2
Pythonは、マシンで使用可能なより大きな整数型を使用します。SOは通常、32ビットマシンでは32ビットサイズ、64ビットマシンでは64ビットサイズになります。しかし、64ビット整数を定義する32ビットアーキテクチャが存在する可能性があります。その場合、Pythonは64ビット整数を使用します。
Bakuriu 2012

4

Python 2.7.9は数値を自動昇格します。int()またはlong()を使用するかどうか不明な場合。

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

4

Python 2は、値のサイズに基づいてタイプを自動的に設定します。最大値のガイドは以下にあります。

Python 2のデフォルトのIntの最大値は65535で、これを超えると長くなります

例えば:

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

Python 3では、longデータ型が削除され、すべての整数値がIntクラスによって処理されます。Intのデフォルトサイズは、CPUアーキテクチャによって異なります。

例えば:

  • 32ビットシステムの整数のデフォルトのデータ型は「Int32」になります。
  • 64ビットシステム整数のデフォルトのデータ型は「Int64」になります

各タイプの最小値/最大値は以下にあります:

  • Int8:[-128,127]
  • Int16:[-32768,32767]
  • Int32:[-2147483648,2147483647]
  • Int64:[-9223372036854775808,9223372036854775807]
  • Int128:[-170141183460469231731687303715884105728,170141183460469231731687303715884105727]
  • UInt8:[0,255]
  • UInt16:[0,65535]
  • UInt32:[0,4294967295]
  • UInt64:[0,18446744073709551615]
  • UInt128:[0,340282366920938463463374607431768211455]

Intのサイズが上記の制限を超えた場合、Pythonはそのタイプを自動的に変更し、この最小/最大値の増加を処理するためにより多くのメモリを割り当てます。Python 2では「long」に変換されていましたが、現在は次のサイズのIntに変換されるだけです。

例:32ビットオペレーティングシステムを使用している場合、Intの最大値はデフォルトで2147483647になります。2147483648以上の値が割り当てられている場合、タイプはInt64に変更されます。

intのサイズとメモリ割り当てを確認する方法はいくつかあります。注:Python 3では、組み込みのtype()メソッドを使用すると、使用している<class 'int'>Intのサイズに関係なく常に返されます。


1

python 3.xから、統合された整数ライブラリは以前のバージョンよりもさらにスマートになりました。私の(i7 Ubuntu)ボックスには次のものがあります、

>>> type(math.factorial(30))
<class 'int'>

実装の詳細については、Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.cファイルを参照してください。最後のファイルは動的モジュールです(soファイルにコンパイルされます)。コードはよくフォローされています。


1

ここで与えられたすべての答え、特に@James Lanesを続けるために

整数型のサイズは次の式で表すことができます。

合計範囲=(2 ^ビットシステム)

下限=-(2 ^ビットシステム)* 0.5上限=((2 ^ビットシステム)* 0.5)-1


0

兄弟クラスの定義であるためint、それらを管理しlongます。+、-、*、/などの適切なメソッドがあり、適切なクラスの結果が生成されます。

例えば

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

この場合、クラスにintは、必要なときに結果__mul__を作成するメソッド(*を実装するメソッド)がありますlong

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.