(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实现覆盖上面的定义” - 这是什么解释了它的区别?如果是这样,我将如何创建这样的预编译模块?
非常感谢任何建议。
答案 0 :(得分:7)
总结上面的评论以便可以关闭问题,内置模块更快的原因是因为模块是在c中预编译的。尝试复制此类性能基本上有两种选择,一种是使用像PyPy这样的JIT编译器,其中编译是在运行时完成的,另一种是用C语言编译自己的模块,使用Cython或其他一些变体来集成C代码与python。从上面的sharth到bisect的c代码的链接特别有用,可以找到here。再次感谢所有的帮助。