当前位置: 首页 > 知识库问答 >
问题:

为什么python内置的二进制搜索函数运行得这么快?

澹台镜
2023-03-14

(sharth的评论已经回答了这个问题。)

我已经用python编写了一个二进制搜索算法,它或多或少遵循与在bisect模块中找到的bisect_left函数相同的结构。事实上,它有几个较少的条件,因为我知道,高点是列表的长度,低点是0。然而由于某种原因,内置函数的运行速度是我的5倍。

我的代码如下:

def bisection_search(word, t):

    high = len(t)
    low = 0

    while low < high:
        half = (high+low)/2
        if t[half] < word:
            low = half + 1
        else:
            high = half
    return low

内置函数的源代码是:

def bisect_left(a, x, lo=0, hi=None):
    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        if a[mid] < x: lo = mid+1
        else: hi = mid
    return lo

正如你所看到的,几乎完全相同。然而,my函数(在100000字的有序列表中搜索最后一个术语)的超时输出为-3.60012054443e-05,其中内置函数达到-6.9141387935E-06。是什么解释了这种差异?

在源代码的末尾有一条评论说“用一个快速C实现覆盖上面的定义”——这就是解释差异的原因吗?如果是这样,我将如何创建这样一个预编译模块?

非常感谢您的建议。

共有1个答案

郭胤
2023-03-14

为了总结上面的评论以便结束这个问题,内置模块之所以更快,是因为这些模块是用c语言预编译的。基本上有两种方法可以尝试复制这种性能,一种是使用像PyPy这样的JIT编译器,其中编译是在运行时完成的,另一种是用c语言编译您自己的模块,使用Cython或其他变体将C代码与python集成。上面从sharth到对分c代码的链接特别有用,可以在这里找到。再次感谢你的帮助。

 类似资料:
  • 考虑到这个问题:峰值元素是一个大于相邻元素的元素。 给定一个输入数组,其中num[i]≠ num[i 1],找到一个peak元素并返回其索引。 该数组可以包含多个峰值,在那种情况下将索引返回到任何一个峰值都是精细的。 示例:Array=[1,4,5,7,4,3,1]。峰值指数=3(即7)。 下面的代码非常有效(不仅仅适用于此测试用例): 我不明白它是如何工作的——我以为二进制搜索只是用于排序数组/

  • 我目前正试图了解x86_64上某些环路的性能属性(具体来说,我的Intel(R)Core(TM)i3-8145U CPU@2.10GHz处理器)。具体来说,在循环体中添加一条额外的指令来读取内存,几乎可以将性能提高一倍,而细节并不特别重要。 我一直在使用一个由两个主要部分组成的测试程序:一个测试循环和一个正在测试的函数。测试循环运行测试2下的函数32次,每次一个有符号32位整数作为参数(按INT\

  • 输入元素的数量,二叉搜索树的元素,输入要显示的所有子树的元素 bst结构节点的定义 插入fn,节点在叶 搜索eel的地址 使用预设顺序显示制作的bst:根、左、右 我调用insert来创建bst的驱动程序,节点的子树为im

  • //对于bitCount结果 //对于Integer.BitCount结果

  • 问题内容: 我用 和做了一些测试 。他们似乎都慢于。是因为精度更高吗?计算斜边函数的方法是什么?令人惊讶的是,我在文档中找不到任何表明性能不佳的迹象。 问题答案: 这不是一个简单的sqrt函数。您应该检查此链接以实现算法:http : //www.koders.com/c/fid7D3C8841ADC384A5F8DE0D081C88331E3909BF3A.aspx 它具有while循环以检查收

  • 问题内容: 我知道Go有一个包含搜索功能的程序包,但这是出于教育目的。我一直在尝试在Go中实现二进制搜索算法,但无法使其正常工作。 这是我的代码: 它总是打印。为什么? 问题答案: 二进制搜索的逻辑是合理的。唯一的问题是您忘记了将每个递归调用的结果分配给和。 当前,您有以下这些递归调用: 您只需要分配结果: