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。

尤其不要将两种精度操作数混合运算。

【Python 2 到 3 系列】 此整型非彼整型的更多相关文章

  1. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  2. Python基础:数值(布尔型、整型、长整型、浮点型、复数)

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  3. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  4. Python中从SQL型数据库读写dataframe型数据

    Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...

  5. 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...

  6. Python猫荐书系列之五:Python高性能编程

    稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...

  7. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  8. 大牛推荐的30本经典编程书籍,从Python到前端全系列。

    注:为了方便阅读与收藏,我们也制作了30本书籍完整清单的Markdown.PDF版以及思维导图版,大家可以在实验楼公众号后台回复关键字"书籍推荐"获取. Python 系列(10本 ...

  9. python 向下取整,向上取整,四舍五入

    # python 向下取整 floor 向上取整ceil 四舍五入 round import math num=3.1415926 # 向上取整 print(math.ceil(num)) # 向下取 ...

随机推荐

  1. [转]JAVA Iterator 的用法

    java.util包中包含了一系列重要的集合类.本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕. 下面我们先简单讨论一个根接口Collection,然后分析一 ...

  2. Angularjs ui router,路由嵌套 父controller执行问题

    解决方式来源:https://stackoverflow.com/questions/25316591/angularjs-ui-router-state-reload-child-state-onl ...

  3. C# 操作 Excel(.xls和.xlsx)文件

    C#创建Excel(.xls和.xlsx)文件的三种方法 .NET 使用NPOI导入导出标准Excel C# 使用NPOI 实现Excel的简单导入导出 NET使用NPOI组件将数据导出Excel-通 ...

  4. JS动态创建SVG元素并绑定事件

    var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.set ...

  5. Spring Data JPA 事务

    Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...

  6. css改变透明背景png图片的图标颜色

    HTML: <p><strong>原始图标</strong></p> <i class="icon icon-del"> ...

  7. 栅格那点儿事(四C)

    栅格渲染之拉伸(Stretch) 现在我们知道如何在ArcGIS中渲染栅格数据了,但是还有一个常常会碰到的问题,尤其是在使用老版本的ArcGIS的时候,为啥我加了一个栅格数据进来,啥也看不见,是黑色的 ...

  8. VirtualBox中linux虚拟机和主机间的共享文件设置

    设置共享文件路径 点击虚拟机 设置-->选择 共享文件夹 (图1 设置共享文件夹) 设置共享文件夹路径 1 选择路径 2 填写自定义的共享名称(在后面需要与挂载路径相对应) 3 设置自动挂载/固 ...

  9. jsp:jsp包含文件的两种方式

    第一种:include指令 include指令:当JSP转换成Servlet时引入指定文件(指令元素),这是一种静态包含,它运行的时候不会单独编译成.class文件,它生成一个新的整体.class文件 ...

  10. day004-Map类

    1.Map集合概述 Map是一个接口,只要是实现了该接口的类就是一个双列集合. 双列集合就是每次存储元素时需要存储两个元素的集合. 这两个元素称为键值对, Key Value ==>映射关系 特 ...