以最快的方式计算python中的重复单词

Rkz*_*Rkz 4 python performance dictionary hashtable word-count

我试图在23万字的列表上计算重复的单词.我使用python字典这样做.代码如下:

for words in word_list:
    if words in word_dict.keys():
       word_dict[words] += 1
    else:
       word_dict[words] = 1
Run Code Online (Sandbox Code Playgroud)

上面的代码用了3分钟!我运行相同的代码超过150万字,它运行超过25分钟,我失去了耐心并终止.后来我发现,我可以使用从下面的代码在这里(如下所示).结果是如此令人惊讶,它在几秒钟内完成!所以我的问题是什么是更快的方式来做这个操作?我想字典创建过程必须花费O(N)时间.Counter方法如何能够在几秒钟内完成此过程,并创建一个精确的单词词典作为键和频率的值?

from collections import Counter
word_dict = Counter(word_list)
Run Code Online (Sandbox Code Playgroud)

Eev*_*vee 5

这是因为:

if words in word_dict.keys():
Run Code Online (Sandbox Code Playgroud)

.keys()返回所有键的列表.列表需要线性时间进行扫描,因此您的程序在二次方运行!

试试这个:

if words in word_dict:
Run Code Online (Sandbox Code Playgroud)

此外,如果您有兴趣,可以自己查看Counter实施情况.它是用常规Python编写的.


Inb*_*ose 5

你的字典计数方法构建得不好。

defaultdict您可以按以下方式使用 a :

d = defaultdict(int)

for word in word_list:
    d[word] += 1
Run Code Online (Sandbox Code Playgroud)

但是counteritertools 中的方法仍然更快,即使它做几乎相同的事情,因为它是用更有效的实现编写的。但是,使用 counter 方法,您需要向其传递一个列表来进行计数,而使用 defaultdict,您可以将源放在不同位置并进行更复杂的循环。

最终这是您的偏好。如果对列表进行计数,counter那么如果从多个源进行迭代,或者您只是想在程序中使用计数器,并且不希望进行额外的查找来检查某个项目是否已被计数,那么这是可行的方法。然后defaultdict是你的选择。