def compare(d1, d2, ctj, ctk):
cor_ = []
for j_d in range(len(d1)):
for k_d in range(len(d2)):
compare_d = abs(d1[j_d] - d2[k_d])
if compare_d <= CD:
cor_.append([ctj[j_d], ctk[k_d]])
return cor_
这个函数中d1,d2,ctj,ctk皆为列表,每个列表中的元素有2000个左右,但是运行速度太慢了,达不到要求,(我觉得是复杂度太高了),有没有其他方法改进?
我猜你这儿有个assert是d1和ctj长度相同,d2和ctk长度相同(实际上是:你在
compare
中只用到了ctj[:len(d1)]和ctk[:len(d2)],所以我总可以认为这个assert成立)如果说len(d1)=n,len(d2)=m的话,你原来的
compare
是O(mn)的,我测试了一下CD=100,d1、d2中均为[0, 200]中的随机整数且m=n=2000的情况,大约要2.8s。实际上可以让d1和ctj打包,d2和ctk打包,即用list(zip(d1, ctj))代替d1及ctj而用list(zip(d2, ctk))代替d2及ctj,并以
lambda l: l[0]
为key
来sort
新的d1与d2。然后再把compare
改成这样:这样连
sort
带compare
大概就能做到1.4s。实际上对长度为2000的列表进行sort
的时间可以忽略不计。但本来我觉得因为如果给d2加个游标k_start像这样:
本来我觉得从代价的角度来考量这个更优一些,但不知为何后面这个反而要近3.0s才行。