为什么python的内置二进制搜索功能运行得更快?

时间:2014-02-22 01:27:07

标签: python binary-search

(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

如您所见,几乎完全相同。然而,我的函数的超时时间(在100,000个单词的有序列表中搜索最后一个项)是-3.60012054443e-05,其中内置达到-6.91413879395e-06。是什么解释了这种差异?

source code中,最后有一条评论说“用快速C实现覆盖上面的定义” - 这是什么解释了它的区别?如果是这样,我将如何创建这样的预编译模块?

非常感谢任何建议。

1 个答案:

答案 0 :(得分:7)

总结上面的评论以便可以关闭问题,内置模块更快的原因是因为模块是在c中预编译的。尝试复制此类性能基本上有两种选择,一种是使用像PyPy这样的JIT编译器,其中编译是在运行时完成的,另一种是用C语言编译自己的模块,使用Cython或其他一些变体来集成C代码与python。从上面的sharth到bisect的c代码的链接特别有用,可以找到here。再次感谢所有的帮助。