为什么线性搜索比Python3中的二进制搜索运行得更快?

时间:2018-07-11 18:26:19

标签: python python-3.x

我已经在python中实现了二进制搜索和线性搜索。我用它来搜索113809排序单词列表中的单词。但是二进制搜索比线性搜索需要更多的时间,尽管从理论上讲,二进制搜索应该更快。我已经使用时间功能来测量时间。输出是要搜索的单词的索引以及两个搜索功能所花费的时间。

# binary search
import random
import time
def b_search(t,c, low_index, up_index):
    if low_index > up_index:
        return -1
    middle= (low_index + up_index)//2
    if t[middle]== c:
        return middle
    if t[middle]> c:
        return b_search(t, c, low_index, middle-1)
    if t[middle]< c:
        return b_search(t,c,middle+1, up_index)

def make_list():
    fin= open('words.txt')
    word_list=[]
    for line in fin:
        word= line.strip()
        word_list.append(word)

    return word_list

def l_search(t, c):
    length= len(t)
    index= 0
    while index<length:
        if t[index]== c:
            return index
        index= index+1
    return (-1)



t= make_list()
a= time.time()
print(b_search(t, 'hospital', 0, len(t)-1))
b= time.time()
print('binary search took', b-a, 'seconds')
c= time.time()
print(l_search(t, 'hospital'))
d= time.time()
print('linear search took', d-c, 'seconds')

输出为: 46662 二进制搜索花费了0.07027983665466309秒 46662 线性搜索花费了0.01752614974975586秒

1 个答案:

答案 0 :(得分:1)

我敢打赌,递归二进制搜索中的函数调用会浪费时间。由于python对象可能会随时更改,即b_search“对象”可能从函数更改为变量,因此代码无法像其他语言一样进行优化。

函数调用每次进入和离开函数时都需要操纵堆栈,这需要花费一些时间,在这种情况下,这可能比线性搜索的开销还要大。

另一件事是,线性搜索与高速缓存存储器对齐得很好,而二进制搜索可能会导致高速缓存未命中,至少在最快的高速缓存中如此。但是,函数调用可能是这里的原因。