Numpy是用于有效数值数组的库。
当由gmpy支持时,mpmath是一个用于高效多精度数字的库。
如何有效地将它们组合在一起?还是仅使用带有mpmath数字的Numpy数组已经有效吗?
要求“与本地浮点数一样有效”是没有道理的,但是您可以要求它接近等效C代码(或失败的Java / C#代码)的效率。特别是,高效的多精度数字数组将意味着您可以执行矢量化运算,而不必在全局解释器中查询例如__add__
一百万次。
编辑:对亲密的选民:我的问题是有关将它们组合在一起的有效方法。可能重复的答案特别指出,幼稚的方法效率不高。
拥有dtype = object的numpy数组可能会产生一点误导,因为默认对象的python运算符现在可以处理使使用标准dtypes进行运算的功能强大的numpy机械,这意味着速度不会达到极限不再
最佳答案
免责声明:我维护gmpy2
。在开发版本中执行了以下测试。a
和b
是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/