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
随机分块list查找

测试脚本:

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])
View Code

结果:

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自带的查找方法效率挺高!!!

随机分块算法的主要时间都消耗在变量新增与赋值之类的。。。。

 

就当练习实现自己想法的脚本,这个脚本实际上没用

 

posted @ 2017-08-04 15:22  kuzaman  阅读(453)  评论(0编辑  收藏  举报