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)
这是因为:
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编写的.
你的字典计数方法构建得不好。
defaultdict您可以按以下方式使用 a :
d = defaultdict(int)
for word in word_list:
d[word] += 1
Run Code Online (Sandbox Code Playgroud)
但是counteritertools 中的方法仍然更快,即使它做几乎相同的事情,因为它是用更有效的实现编写的。但是,使用 counter 方法,您需要向其传递一个列表来进行计数,而使用 defaultdict,您可以将源放在不同位置并进行更复杂的循环。
最终这是您的偏好。如果对列表进行计数,counter那么如果从多个源进行迭代,或者您只是想在程序中使用计数器,并且不希望进行额外的查找来检查某个项目是否已被计数,那么这是可行的方法。然后defaultdict是你的选择。
| 归档时间: |
|
| 查看次数: |
14338 次 |
| 最近记录: |