[英]Time Analysis in python
import math
import time
import random
def sequential_search(key,sorted_list):
for element in sorted_list:
if element==key:
return True
else :
return False
def binary_search(key,sorted_list):
l=0
r=len(sorted_list)-1
while l<=r:
m=int(math.floor((l+r)/2))
if key==sorted_list[m]:
return m
elif key<sorted_list[m]:
r=m-1
else:
l=m+1
def ternary_search(key,sorted_list):
length = len(sorted_list)
left = 0
right = length
index = 0
x = True
while x and left <= right:
#focal = (high + low) //3
if left == right:
#check similarity between values and key
return left
elif right - left > 0:
index1 = ((right+2*(left))//3)
index2 = ((2*(right)+left)//3)
if sorted_list[index1] == key:
return index1
elif sorted_list[index2] == key:
return index2
else:
if key<sorted_list[index1]:
right = index1 - 1
elif key > sorted_list[index1] and key <sorted_list[index2]:
right = index2 - 1
left = index1 - 1
elif key > sorted_list[index2]:
left = index2+1
return index
def interpolation_search(key, sorted_list):
low = 0
high = len(sorted_list) - 1
while sorted_list[low] <= key and sorted_list[high] >= key:
mid = low + ((key - sorted_list[low]) * (high - low)) \
/ (sorted_list[high] - sorted_list[low])
# out of range is possible
if sorted_list[mid] < key:
low = mid + 1
elif sorted_list[mid] < key:
high = mid - 1
else:
return mid
if sorted_list[low] == key:
return low
return None
def run_experiment():
sorted_list=random.sample(range(1000000), 1000)
sorted_list.sort()
key=random.randint(0,1000001)
key=1000001
time_ss=time.time()
sequential_search(key,sorted_list)
time_ss_end=time.time()
print time_ss_end-time_ss
time_bs=time.time()
binary_search(key,sorted_list)
print time.time()-time_bs
time_ts=time.time()
ternary_search(key,sorted_list)
print time.time()-time_ts
time_is=time.time()
interpolation_search(key,sorted_list)
print time.time()-time_is
if __name__ == '__main__':
run_experiment()
raw_input("Stop")
我是Python的新手。 我想测量这些算法的时间,所以我使用的是“时间”方法。 但是输出看起来像:
>>>
0.0
0.0
0.0
0.0
>>>
有时第一次测量会改变。 如何更改这些输出? 我应该更改代码以进行时间分析吗?
您的代码太快,无法以这种方式进行概要分析(可能是速度很好)
如果您真的想提高速度,请尝试以下操作
def run_experiment():
print timeit.timeit("sequential_search(key,sorted_list)",
"import random;from main import sequential_search;
key=10000001;sorted_list=sorted(random.sample(range(100000),1000))")
或使要测试的列表更大...
根据我的测试,您的脚本可以在同一毫秒内快速运行。
您可以按照此答案并将您的时间转换为毫秒,以获得更好的准确计时。
原因是(从计算机的角度来看)几乎没有进行任何操作来找到密钥,因此操作几乎立即完成(因此零时间或接近零时间)。
如果要检查不同方法的相对效率,请像这样循环地多次调用每个函数:
loops = 2000
for i in range(loops):
sequential_search(key,sorted_list)
对每种类型的搜索执行此操作。 如果您仍然获得接近于零的结果,只需使循环数更大
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.