Python 如何管理 int 和 long?
- 2025-02-27 09:05:00
- admin 原创
- 93
问题描述:
有人知道 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'>
解决方案 1:
int
并在几个版本之前long
被“统一” 。在此之前,可以通过数学运算溢出 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 位中为 GB,在 64 位中为 EB。
+ 如此大的 int 会具有类似于 8 的幂的值`sys.maxsize`。
解决方案 2:
这个PEP应该会有帮助。
最重要的是,你真的不必担心 Python 版本 > 2.4
解决方案 3:
Python 2 将根据值的大小自动设置类型。最大值的指南可在下面找到。
Python 2 中默认 Int 的最大值是 65535,任何大于该值的值都将是一个 long
例如:
>> 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。
<class 'int'>
有多种方法来检查 int 的大小及其内存分配。注意:在 Python 3 中,无论您使用什么大小的 Int,使用内置的 type() 方法都会始终返回。
解决方案 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 使用 int(32 位有符号整数,我不知道它们在底层是否是 C int)来表示适合 32 位的值,但对于任何更大的值,它会自动切换到 long(任意大的位数 - 即 bignums)。我猜这可以加快较小值的速度,同时通过无缝过渡到 bignums 来避免任何溢出。
解决方案 5:
很有趣。在我的 64 位 (i7 Ubuntu) 机器上:
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>
猜测它在更大的机器上会升级到 64 位整数。
解决方案 6:
Python 2.7.9 自动提升数字。对于不确定使用 int() 还是 long() 的情况。
>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>
解决方案 7:
从 python 3.x 开始,统一整数库比旧版本更加智能。在我的(i7 Ubuntu)机器上,我得到了以下内容,
>>> type(math.factorial(30))
<class 'int'>
有关实现细节,请参阅Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
文件。最后一个文件是动态模块(编译为 so 文件)。代码注释得很好,可以理解。
解决方案 8:
它管理它们,因为int
和long
是兄弟类定义。它们具有适当的 +、-、*、/ 等方法,这些方法将产生适当类的结果。
例如
>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>
在这种情况下,该类int
有一个__mul__
方法(实现*的方法),它long
在需要时创建一个结果。
解决方案 9:
继续回答这里给出的所有问题,特别是@James Lanes
整数类型的大小可以用以下公式表示:
总范围 = (2^位系统)
下限 = -(2 ^ 位系统)0.5 上限 = ((2 ^ 位系统)0.5) - 1
扫码咨询,免费领取项目管理大礼包!