首页 > 解决方案 > Python:寻找更快、更不准确的 sqrt() 函数

问题描述

我正在为不需要高精度结果的大量毕达哥拉斯计算寻找更便宜、不太准确的平方根函数。输入是正整数,如有必要,我可以设置输入上限。输出到 1dp 精度 +- 0.1 如果好的话,但我什至可以输出到最接近的整数 +- 1。python 中是否有内置的东西可以帮助解决这个问题?像 math.sqrt() 这样的东西可能会做更少的近似?

标签: pythonperformancesqrt

解决方案


正如我在评论中所说,考虑到它与's函数的链接,我认为你math.sqrt在本机 python中的速度不会好得多。但是,您的问题表明您需要执行大量“毕达哥拉斯计算”。我假设您的意思是您有很多带边的三角形,并且您想找到所有三角形的 c 值。如果是这样,以下内容对您来说已经足够快了。这利用了:Csqrtabvectorizationnumpy

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'ss 方法来执行此操作:

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. 虽然,我没有基准来支持这一点:) - 但我可以为你制作它们(或者你也可以这样做!)


推荐阅读