处理代码中的大数字

时间:2009-09-06 20:13:20

标签: python algorithm

我正在编写一个编程问题,我需要处理一个涉及100000位数的数字。 python可以处理这样的数字吗?

5 个答案:

答案 0 :(得分:23)

正如其他答案所示,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(例如,因为您无法:例如,Google App Engine目前不支持gmpy)。

最后,一个中间案例:

$ 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代码中乘以两个巨大的数字可能比简单的加法慢几千倍,而gmpy的减速速度则小于100倍(即使只有一个,它也不会太差)如果这些数字已经是gmpy自己的格式,那么转换另一个数字会产生开销。

答案 1 :(得分:7)

是; Python 2.x有两种类型的整数, int 的大小有限,无限大小。但是,如果需要,所有计算都将自动转换为long。处理大数字可以正常工作,但如果你尝试打印100000个数字输出,或者甚至尝试从中创建一个字符串,那么其中一个较慢的事情就是。

如果您还需要任意十进制定点精度,则有十进制模块。

答案 2 :(得分:4)

当然可以:

>>> s = 10 ** 100000

答案 3 :(得分:3)

似乎工作正常:

>>> x = 10**100000
>>> x
10000000000000000000000000000000000000000000000000000000000000000000000000000000
[snip]
00000000L

根据http://docs.python.org/library/stdtypes.html,“长整数具有无限精度”,这可能意味着它们的大小不受限制。

答案 4 :(得分:3)

正如已经指出的那样,Python可以处理与内存允许的数量一样大的数字。我想补充一点,随着数字越来越大,所有操作的成本都会增加。这不仅仅是打印/转换为字符串(虽然这是最慢的),添加两个大数字(大于您的硬件可以原生处理的数字)不再是O(1)。

我只是提到这一点,指出尽管Python巧妙地隐藏了使用大数字的细节,但你仍然要记住,这些大数字操作并不总是像普通的操作那样。