我想在不使用数学模块的情况下找到数字的平方根,因为我需要调用该函数大约20k次并且不想通过在每次调用函数时链接到数学模块来减慢执行速度< / p>
有没有更快更方便的方法来查找平方根?
答案 0 :(得分:28)
导入数学模块只发生一次,你可能不会比数学模块快得多。还有一个关于Which is faster in Python: x**.5 or math.sqrt(x)?的旧Stackoverflow问题。目前尚不清楚哪种方法更快。
答案 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)