使用小数类型增加了功率计算中的时间成本



当我处理很小的数字时,我将操作(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实现。我从未使用过,但可能想尝试一下。

最新更新