繁体   English   中英

python中的时间分析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM