tkt*_*711 0 python performance dictionary list python-3.x
有一个很长的单词列表,列表的长度约为360000.我想得到每个单词的频率,并成为一个字典.
例如:
{'I': 50, 'good': 30,.......}
Run Code Online (Sandbox Code Playgroud)
由于单词列表很大,我发现计算它需要花费很多时间.你有更快的方法来完成这个吗?
到目前为止,我的代码如下:
dict_pronoun = dict([(i, lst_all_tweet_noun.count(i)) for i in
lst_all_tweet_noun])
sorted(dict_pronoun)
Run Code Online (Sandbox Code Playgroud)
你在做错了几件事:
您首先构建一个巨大的列表,然后将该列表对象转换为字典.没有必要使用[..]列表理解; 只是删除了[,并]会变成一个更内存高效发电机表达.
您正在使用dict()循环而不是{keyexpr: valueexpr for ... in ...}字典理解; 这将完全避免生成器表达并直接构建字典.
您正在使用list.count(),这会对每个元素的列表进行完整扫描.您进行了线性扫描,将N个项目计入O(N**2)二次问题.每次发现密钥已存在时,您只需在字典中递增一个整数,否则将值设置为0,但有更好的选项(见下文).
该sorted()呼叫正忙着工作; 它返回一个排序的键列表,然后再次丢弃.字典不是可排序的,不能再以任何速度再生成字典.
在这里使用一个collections.Counter()对象进行计数; 它使用线性扫描:
from collections import Counter
dict_pronoun = Counter(lst_all_tweet_noun)
Run Code Online (Sandbox Code Playgroud)
A Counter有一种Counter.most_common()方法可以有效地为您提供按计数排序的输出,这是我怀疑您希望通过sorted()调用实现的.
例如,要获取前K个元素(其中K小于N,字典的大小),a heapq用于在O(NlogK)时间内获取这些元素(避免完整的O(NlogN)排序).