为什么Python可以处理任意长度的整数运算——Python原理详解
在做LeetCode题目的时候,有一类题目是关于大数运算的。比如,全排列计算或者组合运算,在使用C语言或者Java代码解决这类问题的时候都会遇到变量数值超过阈值的情况。一般来说需要自己构造字符串数组或者是其它数组来存储超过长度的数值。但是,使用Python语言处理这类问题时候却毫无压力,这类题目的计算不会有任何问题,例如,如果使用Python计算$2^{20000}$时候,轻轻松松输出结果:
>>> 2 ** 20000
398027684033796659235430720619120......
显然,这么大的数用C语言或者Java都是无法直接处理的。那么,Python是如何处理如此大的数的,为什么Python的整数类型没有长度限制?本文将从Python底层实现解释这个问题。
一、Python大整数历史
先简单介绍一下,在Python2中,整数有两种类型,int与long。但是,我们使用的时候没有区分,只是在内部会有不同处理:
# Python 2.7版本
>>> x=10
>>> print(type(x))
<class 'int'>
>>> y=111111111111111111111111111111111111111111111111111111111111111111
>>> print(type(y))
<class 'long'>
但是实际会有不同的类型存在。主要是因为Python底层是C语言实现的,因此,对于整数的长度有限制。在Python2中,int的最大值是受限于C语言的long类型(C语言中的long在32位机器和64位机器不一样长度,这也是导致python2编译后的pyc文件无法在不同架构机器移植的原因之一)超过这个数值都是long。不过,Python2的long也是没有长度限制的。在Python3中,long类型已经被删除,只保留int来处理数据。接下来我们描述Python如何使用int处理很大的数字的。
