(已由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。这种差异是什么原因呢?
在源代码中,最后有一条注释:“使用快速C实现覆盖上述定义” - 这是什么解释了这种差异吗?如果是这样,我该如何创建这样的预编译模块呢?
非常感谢您的任何建议。
_bisect
的 C 代码:http://hg.python.org/cpython/file/0199bff14c5c/Modules/_bisectmodule.c - Bill Lynchpyximport
可以实时编译扩展(用于开发)。 - jfs