簡體   English   中英

Python:尋找更快,更不准確的sqrt()函數

[英]Python: looking for a faster, less accurate sqrt() function

我正在尋找一種便宜,精度不高的平方根函數,用於不需要大量精確結果的大量畢達哥拉斯計算。 輸入是正整數,如有必要,我可以將輸入上限。 輸出到1dp的精度為+-0.1(如果不錯),但是我什至可以忽略輸出到最接近的整數+-1。python內置了什么可以幫助解決這個問題的嗎? 像math.sqrt()這樣的近似值可能較少?

正如我在評論中所說,鑒於它與Csqrt函數的鏈接,我認為您在本機python上的math.sqrt速度不會提高很多。 但是,您的問題表明您需要執行許多“畢達哥拉斯計算”。 我假設您的意思是您有很多帶有邊ab的三角形,並且您想找到所有三角形的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM