Numpy是用于有效数值数组的库。

当由gmpy支持时,mpmath是一个用于高效多精度数字的库。

如何有效地将它们组合在一起?还是仅使用带有mpmath数字的Numpy数组已经有效吗?

要求“与本地浮点数一样有效”是没有道理的,但是您可以要求它接近等效C代码(或失败的Java / C#代码)的效率。特别是,高效的多精度数字数组将意味着您可以执行矢量化运算,而不必在全局解释器中查询例如__add__一百万次。

编辑:对亲密的选民:我的问题是有关将它们组合在一起的有效方法。可能重复的答案特别指出,幼稚的方法效率不高。


  拥有dtype = object的numpy数组可能会产生一点误导,因为默认对象的python运算符现在可以处理使使用标准dtypes进行运算的功能强大的numpy机械,这意味着速度不会达到极限不再

最佳答案

免责声明:我维护gmpy2。在开发版本中执行了以下测试。

ab是1000个元素列表,其中包含具有250位精度的伪随机gmpy2.mpfr值。该测试对两个列表执行逐元素相乘。

第一个测试使用列表理解:

%timeit [x*y for x,y in zip(a,b)]
1000 loops, best of 3: 322 µs per loop


第二个测试使用map函数执行循环:

%timeit list(map(gmpy2.mul, a, b))
1000 loops, best of 3: 299 µs per loop


第三个测试是列表理解的C实现:

%timeit vector2(a,b)
1000 loops, best of 3: 243 µs per loop


在第三次尝试中,vector2试图成为行为良好的Python函数。使用gmpy2的类型转换规则处理数字类型,完成错误检查等。检查上下文设置,根据要求创建次普通数,如果需要则引发异常,等等。如果忽略所有Python增强功能并假设所有值都已经gmpy2.mpfr,我就可以减少第四次尝试的时间:

%timeit vector2(a,b)
10000 loops, best of 3: 200 µs per loop


第四版没有进行足够的错误检查,无法普遍使用,但是第三到第四次尝试之间的版本是可能的。

可以减少Python的开销,但是随着精度的提高,有效的节省量会减少。

关于python - 高效的多精度数值数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31093986/

10-12 16:36
查看更多