Python:寻找更快,更不准确的sqrt()函数

时间:2018-12-10 02:13:33

标签: python performance sqrt

我正在寻找一种便宜,准确度不高的平方根函数,用于不需要大量精确结果的大量毕达哥拉斯计算。输入是正整数,如有必要,我可以将输入上限。输出到1dp的精度为+-0.1(如果不错),但是我什至可以忽略输出到最接近的整数+-1。python内置了什么可以帮助解决这个问题的吗?像math.sqrt()这样的近似值可能较少?

2 个答案:

答案 0 :(得分:3)

正如我在评论中所说,考虑到它与math.sqrt的{​​{1}}函数的联系,我认为您在本机python上的速度不会比C更好。但是,您的问题表明您需要执行许多“毕达哥拉斯计算”。我假设您的意思是您有很多三角形,其侧面为sqrta,并且您想找到所有三角形的c值。如果是这样,以下对您来说将足够快。这将vectorizationb结合使用:

numpy

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

但是,如果您确实想要快速平方根的python实现,则可以使用Newton'ss method`来做到这一点:

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()

但是,即使容忍度很高(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。虽然,我没有任何基准可以支持:)-但是我可以为您制作基准(或者您也可以这样做!)

答案 1 :(得分:1)

@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肯定会比您将要实现的任何实现都要快。让我们对这两个进行基准测试:

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