Bignum实现有效添加小整数

sli*_*cki 5 c++ python gmp bignum arbitrary-precision

我一直在使用python的本机bignums算法,并决定尝试通过将其转换为C++来加速它.当我使用long long时,C++比python快约100倍,但是当我在C++中使用GMP绑定时,它只比python快10倍(适用于长long的相同情况).

是否有更好的bignum实现来进行大量的小额外添加?例如,我们有一个很大的数字N我们将添加很多小+1,+ 21,+ 1等等,并且每隔一段时间又增加一个大数字M?

Nic*_*ood 2

GMP 库本身有一个快速短整数添加到 MPZ 例程

void mpz_add_ui (mpz_t rop, mpz_t op1, unsigned long int op2)
Run Code Online (Sandbox Code Playgroud)

我不知道 gmpy 是否使用它,但如果它确实尝试将普通的 python int 添加到 mpz 与将 mpz 添加到 mpz 并看看它是否更快。

编辑

我尝试了一些基准测试,发现没有任何区别

$ python -m timeit -c 'from gmpy import mpz
> a=mpz(10**1000)' 'a+1'
100000 loops, best of 3: 5.4 usec per loop

$ python -m timeit -c 'from gmpy import mpz
a=mpz(10**1000); b=mpz(1)' 'a+b'
100000 loops, best of 3: 5.5 usec per loop
Run Code Online (Sandbox Code Playgroud)

所以我想 gmpy 不会使用,mpz_add_ui因为我真的希望它会快得多。