Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有小整数高效加法的Bignum实现 我一直在使用Python的本地签名来进行算法,并决定尝试通过将其转换为C++来加快速度。当我使用long long时,C++比python快100x,但是当我在C++中使用GMP绑定时,它比python快10倍(对于长的long同样的情况)。_C++_Python_Bignum_Gmp_Arbitrary Precision - Fatal编程技术网

具有小整数高效加法的Bignum实现 我一直在使用Python的本地签名来进行算法,并决定尝试通过将其转换为C++来加快速度。当我使用long long时,C++比python快100x,但是当我在C++中使用GMP绑定时,它比python快10倍(对于长的long同样的情况)。

具有小整数高效加法的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

有没有更好的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'
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和call
mpz\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