寻找更快的sqrt()函数

2024-06-07 09:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找一个更便宜,更不精确的平方根函数,用于毕达哥拉斯的大量计算,不需要高精度的结果。输入是正整数,如果需要,我可以对输入进行上界。输出到1dp精度为+-0.1,如果好的话,但我甚至可以得到最接近的整数+-1。python中有什么内置的东西可以帮助实现这一点吗?有点像数学.sqrt()这可能会减少近似值?在


Tags: 函数精度数学整数sqrt内置正整数高精度
2条回答

正如我在评论中所说的,我认为在原生python中,由于它与Csqrt函数有链接,在速度上不会比math.sqrt好多少。然而,你的问题表明你需要进行大量的“毕达哥拉斯计算”。我假设你的意思是你有很多边为a和{}的三角形,你想找到所有三角形的c值。如果是这样的话,下面的内容对你来说已经足够快了。这利用了^{}和{}:

import numpy as np

all_as = ... # python list of all of your a values 
all_bs = ... # python list of all of your b values 

cs = np.sqrt(np.array(all_as)**2 + np.array(all_bs)**2).tolist()

如果你的用例不同,那么请用你拥有的数据类型和你想要的操作来更新你的问题。在

但是,如果您真的想要快速平方根的python实现,可以使用Newton'ss method`来实现:

^{pr2}$

然而,即使有很高的容忍度(0.5是荒谬的),你很可能不会打败math.sqrt。虽然,我没有基准来支持这一点:)-但我可以为您制作(或者您也可以这样做!)在

@modesitt比我快:)

Newton's method是一种方法,我的贡献是牛顿方法的实现,它比modesitt建议的方法快一点(以sqrt(65)为例,下面的方法将在4次迭代后返回,而fast_sqrt将在6次迭代后返回)。在

def sqrt(x):
    delta = 0.1
    runner = x / 2
    while abs(runner - (x / runner)) > delta:
        runner = ((x / runner) + runner) / 2
    return runner

也就是说,math.sqrt肯定会比您将要提供的任何实现更快。让我们对这两者进行基准测试:

^{pr2}$

我在我的机器(Macbook pro)上得到的输出:

sqrt took 3.229701 seconds
math.sqrt took 0.074377 seconds

相关问题 更多 >

    热门问题