python大列表中每个元素的出现次数(复杂度低)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haiqiang1995/article/details/88954342

最近复习自己已经掌握的技术,其中如何用获取python list中每个元素的出现次数,这种需求其实不难,但是实际应用场景中,可能回碰到几十亿的训练集,速度的快和慢差距就会很大

你可能会想 ,先新建一个字典,key对应数据库那一列对应的元素,value存储元素个数,然后对数据库里每个元素进行判断,如果有相同的key,则value+1,如果没有,那么就新增这个key,并且令value=1 。写完之后我就心满意足的回家了,想着今天早上来到就可以给leader看结果,感觉自己超级厉害。但是。。。今天早上来到就傻眼了,咦?程序还没有跑完。。。。然后我就取一万条数据测试了一下,大概需要417个小时才能跑完,还是在忽略了dictionary越来越大,存储越来越慢的情况下。。。。 

在网上看了几种方法,自己实际测试了一下:

方法一:就是我刚刚说的那个,最傻的方法。。。

方法二:使用list.count(),可以得到每一个元素,在list中出现的次数,这种方法应该是最容易想到的方法

方法三:collections.Counter()方法,速度快到惊人,不知道是哪个大佬写的,超级厉害,最后我就是用的这种方法。

方法四:听说numpy.unique()也可以?反正我对这种方法略有疑问,再加上懒,就不总结了。

直接看代码吧,感觉注释挺详细的


  
  
  1. #coding=utf-8
  2. from collections import Counter
  3. import numpy
  4. import time
  5. #随机生成一个含有一百万个正整数的列表
  6. def get_random_list():
  7. numpy.random.seed( 10)
  8. return numpy.random.randint( 0, 1000000, 1000000)
  9. #第一种方法:字典
  10. def get_count(l):
  11. dict = {}
  12. t1 = time.time()
  13. for i in l:
  14. #如果元素之前在字典里,那么元素对应的value值+1
  15. if i in dict.keys():
  16. dict[i] = int(dict[i]) + 1
  17. #如果不在,字典中新增对应的items
  18. else:
  19. dict[i] = 1
  20. t2 = time.time()
  21. print dict
  22. print (t2-t1)
  23. #第二种方法:list的count()函数:用于统计某个元素在列表中出现的次数
  24. def get_count_by_count(l):
  25. dict = {}
  26. t1 = time.time()
  27. s = set(l) #集合:得到不重复的元素
  28. for i in s:
  29. dict[i] = l.count(i) #对集合中每个元素分别计数,存入dictionary中
  30. t2 = time.time()
  31. print (t2-t1)
  32. return dict
  33. #第三种方法:使用collections.Counter()函数
  34. #直接collections.Counter(list)就可以得到list中每个元素的个数
  35. #返回类型是collections.Counter,可以将其手动转换为dict
  36. def get_count_by_counter(l):
  37. t1 = time.time()
  38. count = Counter(l) #类型: <class 'collections.Counter'>
  39. t2 = time.time()
  40. print (t2-t1)
  41. count_dict = dict(count) #类型: <type 'dict'>
  42. return count_dict
  43. #or return count
  44. if __name__ == "__main__":
  45. l = get_random_list()
  46. #print l.count(345353)
  47. #get_count(l)
  48. #get_count_by_count(l)
  49. get_count_by_counter(l)

我本来想详细给出每个方法详细用时的,但是三个小时过去了,100万条数据

方法一的结果还没有出来

方法二没有具体测试,不过肯定是比方法一快,但是对于大规模数据依旧不适用

方法三:我还没有来得及眨眼睛,100万条数据,不到一秒钟就运行完了。

感觉今天又发现了新大陆哪,超级开心,哈哈哈哈哈哈。

最近复习自己已经掌握的技术,其中如何用获取python list中每个元素的出现次数,这种需求其实不难,但是实际应用场景中,可能回碰到几十亿的训练集,速度的快和慢差距就会很大

猜你喜欢

转载自blog.csdn.net/Haiqiang1995/article/details/88954342