[英]Python: looking for a faster, less accurate sqrt() function
我正在尋找一種便宜,精度不高的平方根函數,用於不需要大量精確結果的大量畢達哥拉斯計算。 輸入是正整數,如有必要,我可以將輸入上限。 輸出到1dp的精度為+-0.1(如果不錯),但是我什至可以忽略輸出到最接近的整數+-1。python內置了什么可以幫助解決這個問題的嗎? 像math.sqrt()這樣的近似值可能較少?
正如我在評論中所說,鑒於它與C
的sqrt
函數的鏈接,我認為您在本機python上的math.sqrt
速度不會提高很多。 但是,您的問題表明您需要執行許多“畢達哥拉斯計算”。 我假設您的意思是您有很多帶有邊a
和b
的三角形,並且您想找到所有三角形的c值。 如果是這樣,以下對您來說將足夠快。 這利用了numpy
vectorization
:
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的method`來執行此操作:
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比我快:)
牛頓方法是前進的道路,我的貢獻是牛頓方法的實現,它比建議的一個modeitt快一點(以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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.