zoukankan      html  css  js  c++  java
  • 【Python 2 到 3 系列】 此整型非彼整型

    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。
    尤其不要将两种精度操作数混合运算。
  • 相关阅读:
    jupyterlab数据处理
    系统监测模块
    登录验证码的实现
    编码格式检测chardet模块
    图像处理pillow模块
    内存数据的读取
    力扣(LeetCode)728. 自除数
    力扣(LeetCode)709. 转换成小写字母
    Java 层序创建和遍历二叉树
    力扣(LeetCode) 849. 到最近的人的最大距离
  • 原文地址:https://www.cnblogs.com/lanqiu5ge/p/9472242.html
Copyright © 2011-2022 走看看