[英]Python counting occurrence in a list: how to make it faster?
我有一个包含大约600万个项目的字符串列表,并且我试图计算每个唯一值的出现次数。
这是我的代码:
lines = [6 million strings]
unique_val = list(set(lines)) # contains around 500k items
mydict = {}
for val in unique_val:
mydict[val] = lines.count(val)
考虑到我要计算的列表很大,我发现上述代码的运行速度非常慢。
我想知道是否有办法使其更快?
非常感谢
如果您不想使用collections
模块。
counts = dict()
for line in lines:
counts[line] = counts.get(line,0) + 1
或者,如果您不想使用Counter
from collection import defaultdict
counts = defaultdict(int)
for line in lines:
counts[line] += 1
这个怎么样,
from collections import defaultdict
import collections
lines = [600 million strings]
d = defaultdict(int)
for line in lines:
for word, count in collections.Counter(line).items():
d[word] += count
脾气暴躁的解决方案
我认为numpy使用unique会给您最快的答案:
result = dict(zip(*np.unique(lines, return_counts=True)))
Numpy在引擎盖下进行了大量优化。 根据链接的文档,魔术圈围绕return_counts
标志:
return_counts
:布尔值,可选如果为True,则还返回ar中每个唯一值出现的次数。
定时
我选择了您最初的方法,反方法
result = Counter(lines)
和由生成的集合上的numpy方法
N = 1000000
lines = [chr(i%100) for i in range(N) ]
显然,该测试的覆盖面不是很大,但这只是一个开始。
您的进近速度为0.584秒; DeepSpace的Counter为0.162( 3.5倍加速 ),numpy为0.0861( 7倍加速 )。 同样,这可能取决于很多因素,包括您拥有的数据类型:结论可能是numpy或Counter将提供加速,而counter不需要外部库
调用list.count
非常昂贵。 字典访问(O(1)摊销时间)和in
运算符相对便宜。 以下代码片段显示了更好的时间复杂度。
def stats(lines):
histogram = {}
for s in lines:
if s in histogram:
histogram[s] += 1
else:
histogram[s] = 1
return histogram
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.