如何在不使用数学模块的情况下执行平方根?

时间:2010-06-15 16:19:02

标签: python

我想在不使用数学模块的情况下找到数字的平方根,因为我需要调用该函数大约20k次并且不想通过在每次调用函数时链接到数学模块来减慢执行速度< / p>

有没有更快更方便的方法来查找平方根?

11 个答案:

答案 0 :(得分:28)

导入数学模块只发生一次,你可能不会比数学模块快得多。还有一个关于Which is faster in Python: x**.5 or math.sqrt(x)?的旧Stackoverflow问题。目前尚不清楚哪种方法更快。

也许看看NumPySciPy,不一定是对于sqrt,但如果你做了一些繁重的计算,它们就会很方便。

答案 1 :(得分:10)

正如法比安所说,很难比math.sqrt更快。原因是它使用CPython从C库中调用了对应的函数。

但是,您可以通过消除属性查找的开销来加快速度:

from math import sqrt

对sqrt的每次后续调用 not 都必须在math模块中查找,这样可以节省执行时间:

print sqrt(2)

以下是时间数字,从最快到最慢(Python 2.6.5,Mac OS X 10.6.3):sqrt**0.5快:

lebigot@weinberg ~ % python -m timeit -s 'from math import sqrt; x = 2' 'sqrt(x)'
1000000 loops, best of 3: 0.207 usec per loop
lebigot@weinberg ~ % python -m timeit -s 'x = 2' 'x**0.5'
1000000 loops, best of 3: 0.226 usec per loop
lebigot@weinberg ~ % python -m timeit -s 'import math; x = 2' 'math.sqrt(x)'
1000000 loops, best of 3: 0.268 usec per loop

请注意,时序测试计算变量的平方根。他们不计算2**0.5之类的常量,因为2**0.5 pre -calculated,在CPython中:

import dis

def f():
    return 2**0.5

print dis.dis(f)

打印

2           0 LOAD_CONST               3 (1.4142135623730951)
            3 RETURN_VALUE        

你看到常量浮点sqrt(2)= 1.414 ...

如果你操纵数字数组,NumPy的sqrt就是你要走的路,正如另一个答案中提到的那样。

答案 2 :(得分:8)

我认为数学库可能和你自己写的任何东西一样快。但是如果你想自己编写,这里有一个算法。我不懂Python,所以我只会写一些伪代码。

function sqrt(x)
  lastGuess=x/2
  loop
    guess=(lastGuess+x/lastGuess)/2
    if abs(guess-lastGuess)<.000001 // or whatever threshold you want
      exit loop
    lastGuess=guess
  return guess

并将伪代码翻译为Python:

def sqrt(x):
    last_guess= x/2.0
    while True:
        guess= (last_guess + x/last_guess)/2
        if abs(guess - last_guess) < .000001: # example threshold
            return guess
        last_guess= guess

答案 3 :(得分:5)

在某些特殊情况下,您可以将程序大小换成起泡速度。创建一个大型数组并存储每个平方根操作的预先计算结果(使用输入值作为索引)。它非常有限,但你不会得到更快的东西。

(这就是地震的方式)

答案 4 :(得分:3)

你可以实现Newton的方法,但是,虽然它真的很快,但它不可能比我假设在数学模块中实现的C版本更快。请参阅http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

答案 5 :(得分:3)

使用电源操作器,将数字提高到1/2功率:

>>> 2**0.5
1.4142135623730951

关于它是否更快:

>>> timeit.timeit(stmt='sqrt(x)', setup='from math import sqrt; x = 2')
0.7182440785071833
>>> timeit.timeit(stmt='x**0.5', setup='from math import sqrt; x = 2')
0.87514279049432275

答案 6 :(得分:2)

您应该在Jupyter Notebook中键入以下行:

25**(1/2)

答案 7 :(得分:1)

平方根函数

 def sqrt(number):
    if number ** 0.5 == int(number ** 0.5):
      return True
    else:
      return False

答案 8 :(得分:1)

参加聚会太晚了,但是无论如何,我想提一下这些简单的算法:

25**(1/2)

pow(25, 0,5)

将返回5。尽情享受。

答案 9 :(得分:0)

用于计算square的Python代码段。它首先进行初步猜测,如果猜测不够好,则迭代直到我们有一个好的猜测

def gen_square_root_v1(number, epsilon):

   #boundary condition check

   if number == '1':
      return 1

   elif number <= 0:
      print('this computes square root for positive numbers only' )

   else:
      pass


   prev_estimate = number/2

   while True: 

       #each itearation, calculate a new estimate
       new_estimate = (prev_estimate + number/prev_estimate)/2

       #Alternatively can use if abs(new_estimate - prev_estimate) < epsilon:

       #check the difference between  square of new_estimate and number
       if abs(new_estimate * new_estimate - number) < epsilon:
         return prev_estimate

     #if guess is not good enough, use it to make the next guess           
     prev_estimate = new_estimate


#call the function    
print(gen_square_root_v1(16,1e-5))

答案 10 :(得分:0)

以下代码无需使用python的内置方法即可找到数字的平方根。该代码非常易于理解,因为我使用数学简单的解决方案编写了代码。

 x=float(input())
 min=0 
 max=x
 for i in range(10):
     mid=(min+max)/2  #middle value
     res=mid**2       #finding the square of middle value
     if res==x:       #if the middle value is square root program break here
        break        
     elif res>x:      #if the square value of the middle value is more than x then we need to take max value as middle 
        max=mid
     else:                  #if the square value of the middle value is less than x then we need to take min  value as middle 
        min=mid

 print(mid)