[Python 2 到 3 系列]此整型非彼整型

    技术2022-05-13  10

    v2.2 (2.x)以后,python支持不会溢出的 long 型。v3.0后,确切的讲, int 型(依赖运行环境C编译器中long型的精度)消失了,long型替代 int 型,成为新的、不依赖运行环境的、无精度限制的(只要内存装得下)int型。举个例子:==================>>> a = 2147483647 # 32位机上,v3.0 以前 python 的 int 型能容纳的最大正整数,等同于 sys.maxint。>>> b = 1>>> c = a + b # 将导致 int 溢出==================v2.2 前会产生 OverflowError 异常。v2.2 以后 c 会得到预期的值 2147483648,此时,返回值c 已经是一个无精度约束的python  long型了。验证方法:==================>>> c2147483648L>>> type(a)<type 'int'>>>> type(c)<type 'long'>==================v3.0 以后,事实上,不单单c是long型,连a,b都是,因为依赖c编译器long型精度的python int型消失了,long型改名为int型,所有整数天然就是无精度限制的。验证方法:==================>>> c2147483648>>> type(a)<class 'int'>>>> type(c)<class 'int'>==================引伸:1. 在无溢出的前提下,无精度限制的整型计算,会不会比有精度限制的整型慢?答案是肯定的:==================# python v2.7iShort = 2147483647iLong = 2147483647L # L 表示强制使用long型for i in range(10000000):        iShort - 1for i in range(10000000):        iLong - 1==================这样简单测试,第二个循环差计算会比第一个耗时多约50%。但,在v3.0以后,因为没有int型了,所以计算速度应该是long型级别。实际上在v3.0以后,也无法选择精度了,L精度后缀不再支持,默认全部是无精度限制的整型。在v3.2上实际测试可以得到验证,自不赘述。2. 如果 int 计算比 long 快,long 操作数与 int 操作数混合计算,是不是会快一些?答案是否定的:==================# python v2.7iShort = 2147483647iLong = 2147483647L # L 表示强制使用long型iLong2 = 2147483647Lfor i in range(10000000):        iLong - iLong2for i in range(10000000):        iLong - iShort==================这样简单测试,第二个循环差计算会比第一个耗时多约20%。这种现象的原因不难想象,因为差运算前,python必须把两个操作数精度统一,如果有一个操作数是long,另一个强制转换成long再计算;时间主要消耗在这里。总结:所以,在v2.x(x>2)时代,一个提高整型计算速度的小小方法就是,预先判定操作数精度,如果有可能出现long,全部使用long。如果没有必要使用long,最好就别定义成long。尤其不要将两种精度操作数混合运算。参考:PEP 237


    最新回复(0)