Python-没啥用的分块随机查找程序
在数量巨大的list中查找一个元素是否存在,想提高效率,想当然的以为和在java里面一样for循环查找是有优化余地的,于是给自己立了一个题目:
利用Python语言中list切片特性,使用分块后随机找到一个块进行查找,如果成功就直接退出本次查找;如果失败就随机找另一个分块,知道查找成功或失败;
思路:
1、按照list长度,假定一个切片的长度,如len(list)=62734 则切片长度 slice_len就随意设定个10000,最多查7次就找到,最少一次就命中
2、需解决:查找过的分块,不再被随机选中的逻辑。利用slice_len=1000产生一个7个元素(元素包含2个数,第一个数是分块起始坐标,第二个数是分块结束坐标)的list,用过的元素就删除
3、被搜索的list中的元素可能有重复
代码如下:
1 def binarysearch(self,sour_list,target, slice_len): 2 if not slice_len > 0 : slice_len = 1 3 section_count = math.ceil(len(sour_list) / slice_len) 4 def search_areas(sour_list,slice_len): 5 listnew=[] 6 length=len(sour_list) 7 for section in range(section_count): 8 if (section+1)*slice_len <= length: 9 listnew.append([section*slice_len, (section+1)*slice_len -1]) 10 elif section*slice_len == (length-1): 11 listnew.append([length-1]) 12 else: 13 listnew.append([section*slice_len ,length-1]) 14 return listnew 15 section_list = search_areas(sour_list,slice_len) 16 section_count_copy = section_count 17 for section in range(section_count): 18 rand = math.floor(random.random()*(section_count_copy)) 19 section_count_copy-=1 20 templist = sour_list[section_list[rand][0]:section_list[rand][1]] 21 for index,item in enumerate(templist): 22 if item == target: 23 loaction = section_list[rand][0]+index 24 return True,loaction 25 del section_list[rand] 26 return False,None
测试脚本:
1 def test_binarysearch(): 2 lista = [1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,1,2,2,2,2,3,3,3,4,4,4,4,5,5,5,5] 3 print (u2.binarysearch2(lista,6,8)[1]) 4 print (u2.binarysearch2(lista,6,128)[1]) 5 print (u2.binarysearch2(lista,4,13)[1]) 6 print (u2.binarysearch2(lista,5,128)[1]) 7 print (u2.binarysearch2(lista,-1,8)[1]) 8 print (u2.binarysearch2(lista,3,0)[1]) 9 print (u2.binarysearch2(lista,3,-3)[1])
结果:
1 None 2 None 3 28 4 32 5 None 6 None 7 None 8 [Finished in 0.1s]
测试结果证明,查找脚本能按照符合条件查找到目标结果,或不符合条件的查不到结果
随后又进行了list长度100000的随机查找目标的测试,发现循环100次:
如果slice_len-20000则平均查找时间490ms,如果slice_len-200则平均查找时间420ms。证明切片长度影响计算时间。
这里特别强调一点,如果list长度100000,slice_len<8时,目标:41664 使用该脚本查不到数据,但41664肯定是存在list中,这是一个bug,没解决办法。
随后10000次单独用 list的判断元素是否在list里的in方法直接查找:耗时:6ms
随后10000次用随机分块法(slice_len=10000)的耗时:55268ms
结论:不用瞎折腾了,list自带的查找方法效率挺高!!!
随机分块算法的主要时间都消耗在变量新增与赋值之类的。。。。
就当练习实现自己想法的脚本,这个脚本实际上没用