2015-12-16 73 views
2

所以我試着編寫一個簡單的平方根函數。我做了,我想將它與Python的原始版本進行比較。這是我的代碼:試圖在Python中計時我的sqrt函數

from math import sqrt 
import timeit 

def sqrt2(number): 
    i=1 
    while i**2<number: 
     i+=1 
    left=float(i-1) 
    right=float(i) 
    temp = left+(right-left)/2 
    while str(temp**2)!=str(number): 
     if temp**2>number: 
      right=temp 
      temp = left+(right-left)/2 
     elif temp**2<number: 
      left=temp 
      temp = left+(right-left)/2 
     else: 
      return temp 
    return temp 

print timeit.timeit("sqrt2(12)", number=10000, setup='from __main__ import sqrt2') 
print timeit.timeit("sqrt(12)", number=10000, setup='from math import sqrt') 

它簡單地取數和通知時和整數^ 2爲低級,並且當(整數+ 1)^ 2是比我們數字越高,然後除以2的那些2之間的間隙,並嘗試中間的數字等。對我來說沒關係,但是當我嘗試timeit.timeit時,它停止,光標在控制檯顯示,它仍然在工作,但沒有任何反應

+1

'而STR(TEMP ** 2)= STR(數字)' - 爲什麼是*是*你的支票!? – user2357112

+0

cuz checkin'it without str()永遠不會讓循環結束,這對我們的平方根很有用〜(在「。」之後的6-7數字) – Frynio

+4

最好用'math.abs(temp ** 2 - 數字)> = 1e-7' – user502144

回答

1

正如評論中所述,是你在這裏得到一個無限循環:while str(temp**2)!=str(number):

你的問題是temp**2float,而numberint。由於您比較了它們的字符串表示形式,因此第一個將是,例如12.0,第二個是12

您可以修復您的while循環中的條件(使用str()確實看起來很奇怪),或者將float傳遞給您的函數。

順便說一句,您的實施非常緩慢。具有浮動收益的快速運行:

此致:0.461127996445

Python的:0.000571012496948

+0

不,'temp'是一個浮點數,而'number'是一個int ... – Copperfield

+0

正確,我把它們混合起來。 –

+1

謝謝,我會改正我的錯誤 – Frynio