繁体   English   中英

Python计算列表中的出现次数:如何使其更快?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM