周五的时候,leader给我了一个数据分析的小任务,其中第一步就是从数据库里读取代码,然后统计某一列元素出现的次数。说是小任务,其实也不怎么小,大概十亿条数据吧。。。嘤嘤嘤。。。。
然后我一看,这个好眼熟,我以前做过呀,先新建一个字典,key对应数据库那一列对应的元素,value存储元素个数,然后对数据库里每个元素进行判断,如果有相同的key,则value+1,如果没有,那么就新增这个key,并且令value=1 。写完之后我就心满意足的回家了,想着今天早上来到就可以给leader看结果,感觉自己超级厉害。但是。。。今天早上来到就傻眼了,咦?程序还没有跑完。。。。然后我就取一万条数据测试了一下,大概需要417个小时才能跑完,还是在忽略了dictionary越来越大,存储越来越慢的情况下。。。。
在网上看了几种方法,自己实际测试了一下:
方法一:就是我刚刚说的那个,最傻的方法。。。
方法二:使用list.count(),可以得到每一个元素,在list中出现的次数
方法三:collections.Counter()方法,速度快到惊人,不知道是哪个大佬写的,超级厉害,最后我就是用的这种方法。
方法四:听说numpy.unique()也可以?反正我对这种方法略有疑问,再加上懒,就不总结了。
直接看代码吧,感觉注释挺详细的
#coding=utf-8
from collections import Counter
import numpy
import time
#随机生成一个含有一百万个正整数的列表
def get_random_list():
numpy.random.seed(10)
return numpy.random.randint(0,1000000,1000000)
#第一种方法:字典
def get_count(l):
dict = {}
t1 = time.time()
for i in l:
#如果元素之前在字典里,那么元素对应的value值+1
if i in dict.keys():
dict[i] = int(dict[i]) + 1
#如果不在,字典中新增对应的items
else:
dict[i] = 1
t2 = time.time()
print dict
print (t2-t1)
#第二种方法:list的count()函数:用于统计某个元素在列表中出现的次数
def get_count_by_count(l):
dict = {}
t1 = time.time()
s = set(l) #集合:得到不重复的元素
for i in s:
dict[i] = l.count(i) #对集合中每个元素分别计数,存入dictionary中
t2 = time.time()
print (t2-t1)
return dict
#第三种方法:使用collections.Counter()函数
#直接collections.Counter(list)就可以得到list中每个元素的个数
#返回类型是collections.Counter,可以将其手动转换为dict
def get_count_by_counter(l):
t1 = time.time()
count = Counter(l) #类型: <class 'collections.Counter'>
t2 = time.time()
print (t2-t1)
count_dict = dict(count) #类型: <type 'dict'>
return count_dict
#or return count
if __name__ == "__main__":
l = get_random_list()
#print l.count(345353)
#get_count(l)
#get_count_by_count(l)
get_count_by_counter(l)
我本来想详细给出每个方法详细用时的,但是三个小时过去了,100万条数据
方法一的结果还没有出来
方法二没有具体测试,不过肯定是比方法一快,但是对于大规模数据依旧不适用
扫描二维码关注公众号,回复:
5290847 查看本文章
方法三:我还没有来得及眨眼睛,100万条数据,不到一秒钟就运行完了。
感觉今天又发现了新大陆哪,超级开心,哈哈哈哈哈哈。