Python Numpy`searchsorted`比我的二进制搜索函数慢得多
我正在试验二进制搜索,当我的版本运行时,我想我会将它的速度与NumPy的进行比较。我对结果感到相当惊讶,原因有二Python Numpy`searchsorted`比我的二进制搜索函数慢得多,python,python-3.x,numpy,binary-search,Python,Python 3.x,Numpy,Binary Search,我正在试验二进制搜索,当我的版本运行时,我想我会将它的速度与NumPy的进行比较。我对结果感到相当惊讶,原因有二 我知道二进制搜索应该随着logn的增长而增长,我的也是,但是NumPy是线性增长的 不仅如此,NumPy的速度也很慢——在开始时,当然是在结束时 我附上了一张结果图表。橙色是黄色的,蓝色是我的。左边是查找列表中最后一项所用的时间(以毫秒为单位)(items[-1]),底部显示列表的长度。我还进行了检查,以确保我的代码返回正确的值,并且它是正确的 如果我不清楚的话,我的问题基本上是“为
items[-1]
),底部显示列表的长度。我还进行了检查,以确保我的代码返回正确的值,并且它是正确的
如果我不清楚的话,我的问题基本上是“为什么”两个1和2
#binary_search.py
从输入导入可编辑
来自numba import njit
从a.typed导入列表
def_find(项:Iterable[int],to_find:int):
最小值=-1
最大值=长度(项目)
尽管如此:
拆分=整数((最大+最小)/2)
项目=项目[拆分]
如果项==要查找:
返回分割
elif最大值==最小值:
打印(最小值、最大值)
打印(项目)
打印(要查找)
打印(拆分)
退出()
要查找的elif项目>:
最大值=拆分-1
elif项目<要查找:
最小=拆分+1
def findsorted(_items:Iterable[int],to_find:int):
项目=\u项目
返回_查找(项目,要查找)
#graph_results.py
将二进制搜索作为bs导入
导入系统
导入时间
将numpy作为np导入
从matplotlib导入pyplot作为plt
迭代次数=int(sys.argv[1])
项目=[0,1]
lx=[]
ly=[]
nx=[]
纽约=[]
对于范围内的i(2,迭代):
l_平均时间=[]
n_平均时间=[]
项目。追加(项目[-1]+1)
对于范围(0,100)内的uu:
to_find=项目[-1]
lstart=time.time()
bs.findsorted(项目,待查找)
lend=time.time()
nstart=借出
np.searchsorted(要查找的项目)
nend=时间。时间()
ltotal=开始
ntotal=nend nstart
l_平均时间。追加(ltotal)
n_平均时间。追加(n总计)
追加(
圆的(
总和(l_平均次)/len(l_平均次),
1000
)*1000
)
lx.附加(i)
纽约州(
圆的(
总和(n_平均次)/len(n_平均次),
1000
)*1000
)
nx.append(i)
plt.绘图(lx,ly)
plt.绘图(纽约州西北部)
plt.show()
您是否确保这两个函数的行为也相同(对于所有a
和b
?),您的实现不需要为b
使用数组,而Numpy需要数组@AKX所以,如果我有一个大列表,并且想要找到一个项目的位置,最好的解决方案不是使用numpy,而是使用我自己的代码?@AKX我刚刚检查过,它们是相等的,传入的列表和结果都是一样的。@LD实际上,这似乎是标准的Python发行版