我正在寻找一种便宜,准确度不高的平方根函数,用于不需要大量精确结果的大量毕达哥拉斯计算。输入是正整数,如有必要,我可以将输入上限。输出到1dp的精度为+-0.1(如果不错),但是我什至可以忽略输出到最接近的整数+-1。python内置了什么可以帮助解决这个问题的吗?像math.sqrt()这样的近似值可能较少?
答案 0 :(得分:3)
正如我在评论中所说,考虑到它与math.sqrt
的{{1}}函数的联系,我认为您在本机python上的速度不会比C
更好。但是,您的问题表明您需要执行许多“毕达哥拉斯计算”。我假设您的意思是您有很多三角形,其侧面为sqrt
和a
,并且您想找到所有三角形的c值。如果是这样,以下对您来说将足够快。这将vectorization
与b
结合使用:
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