如何在python

时间:2017-11-08 23:33:28

标签: python arbitrary-precision

我在python中使用十进制模块我很新,我想知道什么是计算立方根(或任何根)的最有效方法。我试过num ** (Decimal(1)/Decimal(3)但是花了很长时间。例如,运行python 3的英特尔i5处理器下面的代码大约需要20秒:

from decimal import *

getcontext().prec = 10000
a0 = Decimal(3.0)

import time
beg = time.time()
cuber = a0**(Decimal(1)/Decimal(3))
end = time.time()
print(end-beg)

我知道可以做得更好,因为只需编写一个简单的牛顿算法就可以缩短运行时间(参见下面的代码)。 所以,我的问题是什么是一个好的方法(最好是内置的)来取小数的整数根?

快速牛顿方法,速度快得多(约0.2秒),如下所示:

def cube_root( A):
    guess = (A-Decimal(1))/Decimal(3)
    x0 = (Decimal(2) * guess + A / Decimal(guess*guess) )/Decimal(3.0)
    while 1:
        xn =(Decimal(2) * x0 + A / Decimal(x0*x0) )/Decimal(3.0)
        if xn == x0:
            break
        x0 = xn
    return xn

beg = time.time()
print(cuber - cube_root(a0))
end = time.time()
print(end-beg)

我系统上面所有代码的示例输出是:

23.898984670639038
0E-9999
0.10790443420410156

1 个答案:

答案 0 :(得分:2)

对于这样一个低阶立方根,牛顿将是你最好的选择。通过删除内部测试,我使循环更有效,并且速度提高了约5%。删除多余的Decimal转化次数又增加了2-3%。

def cube_root( A): 
    d1 = Decimal(1)
    d2 = Decimal(2)
    d3 = Decimal(3)

    x0 = (A-d1)/d3
    xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3

    while xn != x0:
        x0 = xn
        xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3

    return xn