【问题标题】:Time Analysis in pythonpython中的时间分析
【发布时间】:2014-04-01 21:34:25
【问题描述】:
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
>>>

有时第一次测量会发生变化。如何更改这些输出?我应该更改我的代码以进行时间分析吗?

【问题讨论】:

标签: python algorithm


【解决方案1】:

您的代码太快,无法以这种方式进行分析(可能它的速度还不错)

如果你真的想加快配置文件的速度,试试这个

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))")

或者使您正在测试的列表更大...

【讨论】:

    【解决方案2】:

    根据我的测试,您的脚本运行速度非常快,在同一毫秒内。

    您可以关注this answer并将您的时间转换为毫秒以获得更准确的时间。

    【讨论】:

      【解决方案3】:

      原因是为了找到密钥而进行的操作非常少(从计算机的角度来看),因此操作几乎立即完成(因此时间为零或接近零)。

      如果要检查不同方法的相对效率,请在循环中多次调用每个函数,如下所示:

          loops = 2000
      
          for i in range(loops):
              sequential_search(key,sorted_list)
      

      对每种类型的搜索执行此操作。如果您仍然得到接近于零的结果,只需将循环设置为更大的数字

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-17
        • 2020-09-23
        • 2012-09-25
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        • 2020-05-02
        相关资源
        最近更新 更多