关于整数:Python如何管理int和long?

How does Python manage int and long?

有没有人知道Python如何管理内部int和long类型?

  • 它是否动态选择正确的类型?
  • int的限制是什么?
  • 我使用的是Python 2.6,与以前的版本有什么不同?

我该如何理解下面的代码?

1
2
3
4
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

更新:

1
2
3
4
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>


intlong被"统一"了几个版本。在此之前,可以通过数学运算溢出int。

3.x通过完全消除long并且只有int来进一步提高了这一点。

  • Python 2:sys.maxint包含Python int可以容纳的最大值。

    • 在64位Python 2.7上,大小为24字节。检查sys.getsizeof()
  • Python 3:sys.maxsize包含Python int的最大大小(以字节为单位)。

    • 这将是32位的千兆字节,64位的艾字节。
    • 这样大的int将具有类似于sys.maxsize的幂的8的值。


这个PEP应该有所帮助。

底线是你真的不应该在python版本> 2.4中担心它


在我的机器上:

1
2
3
4
5
6
7
8
>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

对于适合32位的值,Python使用整数(32位有符号整数,我不知道它们是否为引擎盖下的C ints),但是对于任何东西都会自动切换为long(任意大量的位 - 即bignums)大。我猜这可以加速更小的值,同时避免任何溢出,无缝过渡到bignums。


Python 2.7.9自动提升数字。
对于不确定使用int()或long()的情况。

1
2
3
4
5
6
>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

有趣。在我的64位(i7 Ubuntu)框中:

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

猜猜它在更大的机器上可以达到64位整数。


Python 2将根据值的大小自动设置类型。最大值的指南可以在下面找到。

Python 2中默认Int的Max值为65535,高于此值的任何值都将为long

例如:

1
2
3
4
>> 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将自动更改它的类型并分配更多内存来处理min / max值的增加。在Python 2中,它将转换为'long',现在它只是转换为Int的下一个大小。

示例:如果您使用的是32位操作系统,则默认情况下,Int的最大值将为2147483647。如果指定了值2147483648或更高,则类型将更改为Int64。

有不同的方法来检查int的大小及其内存分配。
注意:在Python 3中,使用内置的type()方法将始终返回,无论您使用的是什么大小的Int。


只是为了继续这里给出的所有答案,特别是@James Lanes

整数类型的大小可以用这个公式表示:

总范围=(2 ^位系统)

下限= - (2 ^位系统)* 0.5
上限=((2 ^位系统)* 0.5) - 1


从python 3.x开始,统一整数库比旧版本更加智能。在我的(i7 Ubuntu)盒子上,我得到了以下内容,

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

有关实现的详细信息,请参阅Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c文件。最后一个文件是动态模块(编译为so文件)。代码评论很好,可以遵循。


从Python 3.x开始,所有整数值都是Int类的一部分。 整数大小现在取决于CPU架构。
enter image description here


它管理它们,因为intlong是兄弟类定义。他们有适当的+, - ,*,/等方法,可以产生适当类的结果。

例如

1
2
3
4
5
6
>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

在这种情况下,类int具有__mul__方法(实现*的方法),在需要时创建long结果。