【问题标题】:How are bignums represented internally?bignums 如何在内部表示?
【发布时间】:2014-04-23 20:01:55
【问题描述】:

Python 提供了一种名为“long”的“bignum”类型,它可以表示任意大的数字。 这种类型的内部表示是什么?

我之所以这么问,部分原因是我很好奇在这些数字上哪些操作可能特别快或特别慢。例如,与乘法或除法相比,位移是否特别快(对于“常规”整数而言)?

【问题讨论】:

标签: python python-2.7 bignum


【解决方案1】:

CPython 的任意精度整数存储在二进制数组digits 中。每个digit 由 15 位或 30 位组成。加法、减法和位移都是 O(n)。乘法(对于足够大的值)使用 Karatsuba multiplication,即 O(n**1.585)。 除法仍然使用经典的 O(n**2) 算法。

【讨论】:

    【解决方案2】:

    嗯,这是我写的。我不确定这有多好,但您可以将其作为起点,以获得更完善、更完整的基准测试。

    import timeit
    
    def timef(f, *args):
        return timeit.timeit(lambda: f(*args), number = 1000000) # repetitions
    
    
    tests = {
        'addition'      : lambda x: x + 17,
        'substraction'  : lambda x: x - 17,
        'multiplication': lambda x: x * 17,
        'division'      : lambda x: x / 17,
        'float division': lambda x: x / 17.0
    }
    
    
    for name, f in tests.items():
        print  'int {0}'.format(name).ljust(20), timef(f, 0)
        print 'long {0}'.format(name).ljust(20), timef(f, 10 ** 50)
        print
    

    我看到int() 的操作确实更快,但并没有快很多

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多