尝试在Python中计时我的sqrt函数
所以我试着编写一个简单的平方根函数。我做到了,我想将它与Python的原始版本进行比较。这是我的密码:尝试在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
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
时,两者都做相同的事情)。正确,我混淆了它们。