当我处理很小的数字时,我将操作(1)更改为(2)。
在此转换后,时间成本相同,但是当我尝试使用小数点提高精度时。确切和转换(2)to(3)时间表>爆炸(〜10次))。
是否有解决方案来减少时间并保持相同的精度?
(1)
alpha = 1. (fyt * qyt ) / (fxt * qxt)
(2)
pow(10, log10(fyt) + log10(qyt) - log10(fxt) - log10(qxt))
(3)
alpha = 10**(Decimal(fyt).log10() + Decimal(qyt).log10() - Decimal(fxt).log10() - Decimal(qxt).log10())
我会说这是可以预期的,因为您在此处具有类型的10**x
的功率计算,在小数的情况下,这意味着在每个步骤之后检查精度。
考虑下面的示例,其中可以清楚地看到小数的功率操作非常昂贵:
In [6]: from decimal import Decimal
In [7]: %timeit 10**.0123456789
100000000 loops, best of 3: 16.6 ns per loop
In [8]: %timeit 10**Decimal(.0123456789)
10000 loops, best of 3: 95.3 µs per loop
因此,直接在第一个(1)上进行(
),而不是在(3)方程上进行小数操作。alpha = (Decimal(fyt) * Decimal(qyt)) / (Decimal(fxt) * Decimal(qxt))
这应该足够快地工作,因为总共只有3个操作发生,并且应该具有相同的精度,因为我们使用的是Decimal
。
有一个称为cDecimal
的外部软件包,这是小数模块的C实现。我从未使用过,但可能想尝试一下。