Python如何管理int和long?


118

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

  • 它会动态选择合适的类型吗?
  • 一个整数的限制是多少?
  • 我正在使用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
您还可以通过var = 666L
qba

8
@Ignacio:了CPython int是C long(默认为带符号)...参见<CPython 2.X source>/Include/intobject.h:typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; 在任何情况下,Python 2.x都int允许使用负数;C unsigned不能应付。
约翰·马钦

PEP 237讨论了Python如何在幕后使这一切看起来一样。
卡雷尔

Answers:


123

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

3.x通过完全消除long而仅具有int来进一步提高了此功能。

  • Python 2sys.maxint包含Python int可以容纳的最大值。
    • 在64位Python 2.7上,大小为24个字节。用检查sys.getsizeof()
  • Python 3sys.maxsize包含Python int可以达到的最大字节数。
    • 这将是32位的千兆字节和64位的EB。
    • 如此大的int的值将等于8的幂sys.maxsize

29
但是Python3将此类型称为“ int”,即使其行为更像2.x的“ long”。

3
Ted的评论:如下所述,当心将大于maxint的内容强制转换为int仍会导致long >>> type(int(sys.maxint + 1))<
type'long

2
sys.maxint将为您提供最大的64位整数(在我的64位计算机上)一个Long可以比64bit大得多,只需尝试“ sys.maxint << 1000000”
fccoelho 2013年

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不会有所帮助。最近刚发生在我身上。
Macke 2012年

1
@Macke:此评论使我省了下来,我以为int可以解决问题,并且想知道为什么我仍然遇到Jython异常。
TED 2012年

@Macke绝对正确。在我目前工作的公司中,我们有一个用Python编写的模拟器,该模拟器通过Tkinter条目获取用户输入,并通过TCP / IP将转换的值发送给模拟嵌入式系统的客户端(用C / C ++编写)。想象一下,当在基于Python的Entry中插入100000000000000000000000时会发生什么::P
rbaleksandar '17

@Mackie好吧,如果您真的不喜欢阅读PEP,它会明确表示:C API保持不变;C代码仍然需要注意长整数和短整数之间的区别。(Python 3.0 C API可能会完全不兼容。)PyArg_Parse *()API已经接受长整数,只要它们在C整数或long表示的范围之内,因此采用C整数或long参数的函数将不会不必担心处理Python long。
Cowbert

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位带符号整数,我不知道它们是否是C整数)适合适合32位的值,但是对于任何东西,它都会自动切换为长整数(任意大的位数,即bignums)更大。我猜想这将加快速度以提供较小的值,同时通过无缝过渡到bignum避免任何溢出。


4

有趣。在我的64位(i7 Ubuntu)盒子上:

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

猜猜它在更大的机器上提升到64位整数。


2
Python使用机器可用的较大整数类型。因此,通常在32位计算机上,int将具有32位的大小,而在64位计算机上,它将具有64位的大小。但是可能会有32位架构定义64位整数,在这种情况下python将使用64位整数。
巴库里

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的Max值为65535,任何高于此值的值都会很长

例如:

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

在Python 3中,长数据类型已被删除,所有整数值都由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,340282366920938938463463374607431768211455]

如果您的Int大小超过上述限制,python将自动更改其类型并分配更多内存以处理此最小值/最大值的增加。在Python 2中,它将转换为“ long”,现在仅转换为下一个Int大小。

示例:如果您使用的是32位操作系统,则Int的最大值默认为2147483647。如果分配的值为2147483648或更大,则类型将更改为Int64。

有多种方法可以检查int的大小及其内存分配。注意:在Python 3中,<class 'int'>无论您使用的是什么Int大小,使用内置的type()方法总是会返回。


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

它管理着他们,因为intlong是同级类定义。它们具有用于+,-,*,/等的适当方法,这些方法将产生适当类的结果。

例如

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.