具有小整数高效加法的Bignum实现 我一直在使用Python的本地签名来进行算法,并决定尝试通过将其转换为C++来加快速度。当我使用long long时,C++比python快100x,但是当我在C++中使用GMP绑定时,它比python快10倍(对于长的long同样的情况)。
有没有更好的bignum实现来实现大量的小添加?例如,我们有一个大数字N,我们将添加许多小的+1、+21、+1等,每隔一段时间会添加另一个大数字M?GMP库本身有一个 我不知道gmpy是否使用了它,但是如果它真的尝试向mpz添加一个普通的python int,而不是向mpz添加一个mpz,看看它是否更快 编辑 我尝试了一些基准测试,发现没有任何区别具有小整数高效加法的Bignum实现 我一直在使用Python的本地签名来进行算法,并决定尝试通过将其转换为C++来加快速度。当我使用long long时,C++比python快100x,但是当我在C++中使用GMP绑定时,它比python快10倍(对于长的long同样的情况)。,c++,python,bignum,gmp,arbitrary-precision,C++,Python,Bignum,Gmp,Arbitrary Precision,有没有更好的bignum实现来实现大量的小添加?例如,我们有一个大数字N,我们将添加许多小的+1、+21、+1等,每隔一段时间会添加另一个大数字M?GMP库本身有一个 我不知道gmpy是否使用了它,但是如果它真的尝试向mpz添加一个普通的python int,而不是向mpz添加一个mpz,看看它是否更快 编辑 我尝试了一些基准测试,发现没有任何区别 $ python -m timeit -c 'from gmpy import mpz > a=mpz(10**1000)' 'a+1' 10
$ 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
所以我猜gmpy没有使用
mpz\u-add\u-ui
,因为我真的希望这会快得多。你做过评测吗?Python和C++的强>整< /强>应用程序。这样你就知道你真的需要额外的速度
试试python3k,它现在已经实现了任意长度的整数 (注意:我帮助维护GMPY,并且在最新版本中实现了很多优化。)
当向mpz添加一个小数字时,GMPY v1.11确实使用了mpz\u add\u ui
。最新版本的GMPY在处理少量数据时也比以前的版本快25%左右
With GMPY 1.04
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.18 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.153 usec per loop
With GMPY 1.11
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.127 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.148 usec per loop
由于将Python int转换为long和callmpz\u add\u ui
比将Python int转换为mpz更快,因此有一个适度的性能优势。如果长时间调用GMP函数与本地操作相比,性能损失是前者的10倍,我不会感到惊讶
你能把几个小数字累加成一个长数字,然后一次把它们加到你的大数字上吗?当唯一的变化是从长数字到GMP MPZ时,整个程序的速度都变慢了。谢谢。你说的“Python 3k现在有任何长度整数”是什么意思?Python至少从2.5版开始就有了任意长度的整数(很可能是以前的版本)。很有趣。我使用C++的算术运算重载,也许这些C++绑定也没有使用这个快速方法。我明天要做一些测试。谢谢是的,我一直在考虑写我自己的类来积累小的数字,然后偶尔把它们加到大的数字中。感谢您提供有关GMPY 1.11的说明。
With GMPY 1.04
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.18 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.153 usec per loop
With GMPY 1.11
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.127 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.148 usec per loop