尝试在Python中计时我的sqrt函数

尝试在Python中计时我的sqrt函数,python,sqrt,timeit,Python,Sqrt,Timeit,所以我试着编写一个简单的平方根函数。我做到了,我想将它与Python的原始版本进行比较。这是我的密码: 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)!=s

所以我试着编写一个简单的平方根函数。我做到了,我想将它与Python的原始版本进行比较。这是我的密码:

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')
从数学导入sqrt
导入时间信息
def sqrt2(编号):
i=1
而我**2号:
右=温度
温度=左+(右-左)/2

elif temp**2如评论中所述,问题是您在这里陷入了无限循环:
而str(temp**2)=str(编号):

您的问题是
temp**2
是一个
float
,而
number
是一个
int
。由于比较了它们的字符串表示形式,因此第一个将是,例如,
12.0
,第二个是,
12

您可以在
while
循环中修复条件(使用
str()
看起来确实很奇怪),或者将
浮点值传递给函数

顺便说一下,您的实现非常缓慢。带浮动的快速跑步返回:

您的:
0.461127996445


python的:
0.000571012496948
而str(temp**2)=str(数字)
-为什么这是你的检查?因为在没有str()的情况下签入它永远不会让循环结束,这对于我们的平方根(在“.”之后是6-7个数字)来说非常好。最好用
math.abs(temp**2-number)>=1e-7检查这个条件,但是为什么要将它设为str??这毫无意义,这会让你陷入无限循环,因为你会给出“12”,因为数字是int,而temp是float,它的字符串形式总是有一个小数点,所以它们总是不同的…@user502144:
abs
在内置的名称空间中,不是
数学
模块。要么不限定名称
abs
使用内置,要么使用
math.fabs
显式浮点绝对值(也就是说,当输入为
float
时,两者都做相同的事情)。正确,我混淆了它们。