Python:寻找更快、更不精确的sqrt()函数

Python:寻找更快、更不精确的sqrt()函数,python,performance,sqrt,Python,Performance,Sqrt,我正在寻找一种更便宜、精度更低的平方根函数,用于不需要高精度结果的大量毕达哥拉斯计算。输入是正整数,如果需要,我可以给输入上界。输出到1dp,精度+-0.1,如果好的话,但我甚至可以输出到最接近的整数+-1。python中有没有内置的东西可以帮助实现这一点?类似于math.sqrt的东西,它的近似值可能更少?正如我在评论中所说的,考虑到math.sqrt与C的sqrt函数的链接,我认为您在速度上不会比本机python中的math.sqrt做得更好。然而,您的问题表明您需要执行大量毕达哥拉斯计算。

我正在寻找一种更便宜、精度更低的平方根函数,用于不需要高精度结果的大量毕达哥拉斯计算。输入是正整数,如果需要,我可以给输入上界。输出到1dp,精度+-0.1,如果好的话,但我甚至可以输出到最接近的整数+-1。python中有没有内置的东西可以帮助实现这一点?类似于math.sqrt的东西,它的近似值可能更少?

正如我在评论中所说的,考虑到math.sqrt与C的sqrt函数的链接,我认为您在速度上不会比本机python中的math.sqrt做得更好。然而,您的问题表明您需要执行大量毕达哥拉斯计算。我假设你的意思是你有很多边为a和b的三角形,你想找到所有三角形的c值。如果是这样,下面的内容对您来说就足够快了。这利用了numpy:

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

但是,如果您真的想要快速平方根的python实现,可以使用:

def fast_sqrt(y, tolerance=0.05) 
    prev = -1.0
    x = 1.0
    while abs(x - prev) > tolerance:  # within range
        prev = x
        x = x - (x * x - y) / (2 * x)
    return x 

然而,即使公差非常高,0.5也是荒谬的,您也很可能无法击败math.sqrt。虽然,我没有基准来支持这一点:-但我可以为你做,或者你也可以做

正如我在评论中所说,考虑到math.sqrt与C的sqrt函数的链接,我认为您在速度上不会比本机python中的math.sqrt做得更好。然而,您的问题表明您需要执行大量毕达哥拉斯计算。我假设你的意思是你有很多边为a和b的三角形,你想找到所有三角形的c值。如果是这样,下面的内容对您来说就足够快了。这利用了numpy:

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

但是,如果您真的想要快速平方根的python实现,可以使用:

def fast_sqrt(y, tolerance=0.05) 
    prev = -1.0
    x = 1.0
    while abs(x - prev) > tolerance:  # within range
        prev = x
        x = x - (x * x - y) / (2 * x)
    return x 

然而,即使公差非常高,0.5也是荒谬的,您也很可能无法击败math.sqrt。虽然,我没有基准来支持这一点:-但我可以为你做,或者你也可以做

@modesitt比我快:

接下来,我的贡献是牛顿方法的一个实现,它比modesit建议的方法快一点。以sqrt65为例,下面的方法将在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肯定会比您将要提供的任何实现更快。让我们以这两个为基准:

import time
import math

def timeit1():
    s = time.time()
    for i in range(1, 1000000):
        x = sqrt(i)
    print("sqrt took %f seconds" % (time.time() - s))

def timeit2():
    s = time.time()
    for i in range(1, 1000000):
        x = math.sqrt(i)
    print("math.sqrt took %f seconds" % (time.time() - s))

timeit1()
timeit2()
我在Macbook pro机器上获得的输出:

sqrt took 3.229701 seconds
math.sqrt took 0.074377 seconds

@摩德西特比我快:

接下来,我的贡献是牛顿方法的一个实现,它比modesit建议的方法快一点。以sqrt65为例,下面的方法将在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肯定会比您将要提供的任何实现更快。让我们以这两个为基准:

import time
import math

def timeit1():
    s = time.time()
    for i in range(1, 1000000):
        x = sqrt(i)
    print("sqrt took %f seconds" % (time.time() - s))

def timeit2():
    s = time.time()
    for i in range(1, 1000000):
        x = math.sqrt(i)
    print("math.sqrt took %f seconds" % (time.time() - s))

timeit1()
timeit2()
我在Macbook pro机器上获得的输出:

sqrt took 3.229701 seconds
math.sqrt took 0.074377 seconds

上限是多少?它是否足够小,可以预先计算所有平方根一次?我将此作为注释,因为这不是一个好的答案,但是math.sqrt很可能比您在python中合理实现的任何东西都要快,因为math.sqrt链接到C的sqrt。这当然取决于你所说的“不太准确”是什么意思,但我敢说math.sqrt会更好。但是,如果需要执行许多sqrt函数,则可以通过将这些计算放入numpy数组并对这些条目进行sqrt来对该操作进行矢量化。你能更具体地说明你正在做的计算类型吗?我想知道x**0.5是否比数学快。sqrtx…@ChuckIvan它实际上不是@modesitt Darnit它的上限是什么?它是否足够小,可以预先计算所有平方根一次?我将此作为注释,因为这不是一个好的答案,但是math.sqrt很可能比您在python中合理实现的任何东西都要快,因为math.sqrt链接到C的sqrt。这当然取决于你所说的“不太准确”是什么意思,但我敢说math.sqrt会更好。但是,如果需要执行许多sqrt函数,则可以通过将这些计算放入numpy数组并对这些条目进行sqrt来对该操作进行矢量化。你能更具体地说明你正在做的计算类型吗?我想知道x**0.5是否比数学快。sqrtx…@ChuckIvan它实际上不是@modesitt DarnitNote NumPy有一个方法,所以你可以用它代替list。。。。但是,通常情况下,列表转换不是必需的。注意NumPy有一个方法,所以您可以使用它来代替列表。。。。但是,通常情况下,列表转换不是必需的。很好!肯定好多了,很好!肯定更好。