[Python 2 到 3 系列]此整型非彼整型
来源:互联网 发布:阿里云栖大会苏州 编辑:程序博客网 时间:2024/06/16 06:50
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型了。
验证方法:
==================
>>> c
2147483648L
>>> type(a)
<type 'int'>
>>> type(c)
<type 'long'>
==================
v3.0 以后,事实上,不单单c是long型,连a,b都是,因为依赖c编译器long型精度的python int型消失了,long型改名为int型,所有整数天然就是无精度限制的。
验证方法:
==================
>>> c
2147483648
>>> type(a)
<class 'int'>
>>> type(c)
<class 'int'>
==================
引伸:
1. 在无溢出的前提下,无精度限制的整型计算,会不会比有精度限制的整型慢?
答案是肯定的:
==================
# python v2.7
iShort = 2147483647
iLong = 2147483647L # L 表示强制使用long型
for i in range(10000000):
iShort - 1
for i in range(10000000):
iLong - 1
==================
这样简单测试,第二个循环差计算会比第一个耗时多约50%。
但,在v3.0以后,因为没有int型了,所以计算速度应该是long型级别。实际上在v3.0以后,也无法选择精度了,L精度后缀不再支持,默认全部是无精度限制的整型。在v3.2上实际测试可以得到验证,自不赘述。
2. 如果 int 计算比 long 快,long 操作数与 int 操作数混合计算,是不是会快一些?
答案是否定的:
==================
# python v2.7
iShort = 2147483647
iLong = 2147483647L # L 表示强制使用long型
iLong2 = 2147483647L
for i in range(10000000):
iLong - iLong2
for i in range(10000000):
iLong - iShort
==================
这样简单测试,第二个循环差计算会比第一个耗时多约20%。
这种现象的原因不难想象,因为差运算前,python必须把两个操作数精度统一,如果有一个操作数是long,另一个强制转换成long再计算;时间主要消耗在这里。
总结:
所以,在v2.x(x>2)时代,一个提高整型计算速度的小小方法就是,
预先判定操作数精度,如果有可能出现long,全部使用long。
如果没有必要使用long,最好就别定义成long。
尤其不要将两种精度操作数混合运算。
参考:PEP 237
- 【Python 2 到 3 系列】 此整型非彼整型
- [Python 2 到 3 系列]此整型非彼整型
- python整型
- 整型
- 整型
- 整型
- 整型
- 整型
- 整型
- 整型
- Python整型:布尔型、标准整型、长整型操作实例
- python整型对象探索
- python整型for语句
- python 整型数组
- 32位非0整型
- 位操作、整型与非整型的存储
- c++整型到字符串转换
- delphi inttohex 整型到十六进制
- 正式开始写打怪程序
- embedded matlab subset中的帧信号(frame-based signals)
- 操作系统总结之进程
- 把COM0变成可以用的普通串口
- custom tree node
- [Python 2 到 3 系列]此整型非彼整型
- [Python 2 到 3 系列]print 是函数
- Android开发之旅一 长按Button原理
- Android游戏开发之旅二 View和SurfaceView
- Android游戏开发之旅三 View类详解
- wince 截屏工具
- [转】研究生导师的肺腑之言
- 安全的使用带后门的webshell
- 同事的你