【问题标题】:Handling big numbers in code处理代码中的大数字
【发布时间】:2010-11-26 01:48:08
【问题描述】:

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

【问题讨论】:

标签: python algorithm


【解决方案1】:

当然可以:

>>> s = 10 ** 100000

【讨论】:

    【解决方案2】:

    它似乎工作正常:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        正如其他答案所示,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 倍(即使只有一个如果numbers 已经是 gmpy 自己的格式,因此存在转换其他格式的开销。

        【讨论】:

        • GMPY2 支持用于整数和有理算术的 GMP 库,但 GMPY2 增加了对 MPFR 和 MPC 库提供的多精度实数和复数算术的支持。 GMP(GNU 多精度算术库)的目标是在所有操作数大小方面都比任何其他 bignum 库都快。 en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library
        【解决方案5】:

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

        我提到这一点只是为了指出,尽管 Python 巧妙地隐藏了处理大数的细节,但您仍然必须记住,这些大数运算并不总是像普通整数那样。

        【讨论】:

          猜你喜欢
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 2014-01-20
          • 1970-01-01
          相关资源
          最近更新 更多