我正在处理一个编程问题,我需要处理一个涉及100000位的数字。 python可以处理这样的数字吗?
最佳答案
如其他答案所示,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
中,庞大的数字化字符串也可能比简单的加法运算慢数百倍(可惜,这本质上是复杂的操作!);但是在 native 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
如您所见,在 native Python代码中将两个巨大的数字相乘可能比简单的加法慢将近1000倍,而对于
gmpy
来说,其减慢幅度不到100倍(即使数字已经在gmpy
中,即使只有一个,也并不算太糟的格式,这样就存在转换其他格式的开销)。