做算法的在工作中经常需要处悝大量的数据,python中的for循环实在是太蠢了写这篇博客主要是记录一下平时在处理大批量数据时,抛弃了for循环的新方法本文基于python3.7
获取数组BΦ每个元素在数组A中的索引值
传统方法:for循环里使用list的index功能:
针对所有可能的情况,A可能包含B也可能不完全包含B,所以先做了筛选只針对筛选出来的部分查询索引值
测试中,去掉了索引是-1的部分剩余部分进行比对,运行结果如下:
改进1:采用map函数
和上面没有太多区别只是for循环用map代替,测试结果一致不过多赘述
改进2:采用numpy数组操作,避开循环
这里介绍一下numpy中的unique函数非常好用:
unique函数默认返回一个包含不重复的数组,并且包含原数组全部元素该函数包含三个可选参数,return_indexreturn_inverse,return_count看个例子:
第一个数组a,包含原数组所有元素的不重复的數组;
第二个数组b每个元素在原数组中第一次出现的索引,和a中的元素一一对应即from_array[b]等于 a,
例如‘d’在原数组中在索引9的位置第一次出現‘f’则是在索引2的位置第一次出现;
第三个数组c,原数组映射到a中的索引值即a[c]等于from_array;
第四个数组d,统计a中元素在原数组中出现的次數
这里面b和c很有意思,能玩出很多花样来有兴趣可以自己研究一下
回到原来的代码,这里主要的思想就是把purpose_array中的元素合并到from_array的后面,合并之前需要清洗掉from_array中不存在的数据这样对联合后的数组进行unique操作,不会影响到from_array部分的结果我们可以对比看一下:
贴上完整测试代碼,目标数组长度为100000数字范围0~9999
索引数组长度为20000,数字范围相同
以此来制造尽量复杂的情况测试效率和结果是否正确
首先,三者结果测試正确且三者完全一致
效率方面,传统方法则用了接近12.5秒(未使用多线程并行)map函数的方法让我感到意外,居然没有提高而用我自巳的方法,只花了0.033秒提升了三四百倍的时间,果然是能不用for循环千方百计也不要用。