在代码中处理大数
我正在处理一个编程问题,需要处理一个有100000位数字的数字。请问Python能处理这样的数字吗?
5 个回答
4
当然可以:
>>> s = 10 ** 100000
7
没错,Python 2.x 有两种整数类型,一种是int,它的大小是有限的,另一种是long,它的大小是无限的。不过,如果需要的话,所有的计算都会自动转换成 long 类型。处理大数字是没问题的,但如果你尝试打印出 100000 位数字,或者试图把它变成字符串,那就会比较慢。
如果你还需要任意小数点固定精度的数字,可以使用 decimal 模块。
25
正如其他回答所提到的,Python支持的整数大小只受可用内存的限制。如果你想要更快的整数处理,可以试试gmpy(作为gmpy的作者和现任共同维护者,我在这方面可能有点偏见;-):
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1'
10000 loops, best of 3: 114 usec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1'
10000 loops, best of 3: 65.4 usec per loop
通常来说,进行数学运算并不是处理这些数字时的瓶颈(虽然如果你在做组合数学或数论相关的运算,gmpy
直接支持一些函数会很有帮助)。把数字转换成十进制字符串可能是最常见的操作,而这会让你感觉比较慢...:
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)'
10 loops, best of 3: 3.11 sec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)'
10 loops, best of 3: 27.3 msec per loop
正如你所看到的,即使在gmpy
中,把巨大的数字转换成字符串也可能比简单的加法慢上几百倍(可惜,这本身就是个复杂的操作!);但在原生Python代码中,这个转换的速度可能会比简单加法慢几万倍,所以你真的要注意这一点,特别是如果你决定不下载和安装gmpy
(比如因为你不能:例如,gmpy目前不支持Google App Engine)。
最后,来看一个中间情况:
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x'
10 loops, best of 3: 90 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y'
100 loops, best of 3: 5.63 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x'
100 loops, best of 3: 8.4 msec per loop
如你所见,在原生Python代码中,两个巨大的数字相乘的速度可能比简单加法慢近1000倍,而使用gmpy
时,速度下降不到100倍(即使只有一个数字已经是gmpy
的格式,转换另一个数字的开销也不是太大)。