为啥我的线性搜索比我在 Python3 中的二分搜索运行得更快?

Posted

技术标签:

【中文标题】为啥我的线性搜索比我在 Python3 中的二分搜索运行得更快?【英文标题】:Why does my linear search run faster than my binary search in Python3?为什么我的线性搜索比我在 Python3 中的二分搜索运行得更快? 【发布时间】:2018-12-19 21:12:14 【问题描述】:

我已经在 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】:

我敢打赌,递归二分搜索中的函数调用会占用时间。由于 python 对象可能会即时更改,即 b_search “对象”可能会从函数更改为变量,因此代码不会像在其他语言中那样优化。

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

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

【讨论】:

我以循环形式实现了二进制搜索,与线性搜索和递归形式的二进制搜索相比,几乎不需要花费时间找到结果。因此,我同意由函数调用创建的堆栈内存是在实现为递归的二进制搜索中看到的延迟的最可能原因。谢谢

以上是关于为啥我的线性搜索比我在 Python3 中的二分搜索运行得更快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在跳转搜索中使用二分搜索而不是线性搜索?

为啥二分搜索是一种分而治之的算法?

我的手机为啥本机音乐搜索不到歌

线性搜索和二分搜索有啥区别?

我的二进制搜索和线性搜索的问题[关闭]

所以我做了一个线性搜索代码,但是当我在数组中输入一个数字时,它仍然会打印(数字没有)为啥会这样?