如何在内部代表bignums?

时间:2014-04-23 20:01:56

标签: python python-2.7 bignum

Python提供了一个" bignum"类型称为"长"这可以代表任意大的数字。 此类型的内部代表是什么?

我问的部分是因为我很好奇这些数字的操作可能特别快或慢。例如,与乘法或除法相比,位移特别快(因为它是"常规"整数)?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

好吧,我写了这个。我不确定这有多好,但您可以将其作为更精确和完整基准的起点。

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()操作确实更快,但很多更快。