最近复习自己已经掌握的技术,其中如何用获取python list中每个元素的出现次数,这种需求其实不难,但是实际应用场景中,可能回碰到几十亿的训练集,速度的快和慢差距就会很大
你可能会想 ,先新建一个字典,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万条数据
方法一的结果还没有出来
方法二没有具体测试,不过肯定是比方法一快,但是对于大规模数据依旧不适用
方法三:我还没有来得及眨眼睛,100万条数据,不到一秒钟就运行完了。
感觉今天又发现了新大陆哪,超级开心,哈哈哈哈哈哈。
最近复习自己已经掌握的技术,其中如何用获取python list中每个元素的出现次数,这种需求其实不难,但是实际应用场景中,可能回碰到几十亿的训练集,速度的快和慢差距就会很大