我的代码确实对小样本执行但不对大样本执行

My code does execute for small sample but not for a large

我尝试计算变量中单词出现的频率。变量计数超过 700.000 个观察值。输出应该 return 一个包含出现次数最多的单词的字典。我使用下面的代码来做到这一点:

d1 = {}
for i in range(len(words)-1):
    x=words[i]
    c=0
    for j in range(i,len(words)):
        c=words.count(x)
    count=dict({x:c})
    if x not in d1.keys():
        d1.update(count)

我已经 运行 编写了前 1000 次观察的代码,并且运行良好。输出如下所示:

[('semantic', 23),
 ('representations', 11),
 ('models', 10),
 ('task', 10),
 ('data', 9),
 ('parser', 9),
 ('language', 8),
 ('languages', 8),
 ('paper', 8),
 ('meaning', 8),
 ('rules', 8),
 ('results', 7),
 ('performance', 7),
 ('parsing', 7),
 ('systems', 7),
 ('neural', 6),
 ('tasks', 6),
 ('entailment', 6),
 ('generic', 6),
 ('te', 6),
 ('natural', 5),
 ('method', 5),
 ('approaches', 5)]

当我尝试 运行 它进行 100.000 次观察时,它保持 运行ning。我已经试了24个多小时了,还是不执行。有人有想法吗?

您可以使用 collections.Counter.

from collections import Counter

counts = Counter(words)
print(counts.most_common(20))

@Jon 的答案对你来说是最好的,但在某些情况下 collections.counter 会比迭代慢。 (特别是如果之后你不需要按频率排序)正如我在

中所问

您可以通过迭代计算频率。

d1 = {}
for item in words:
  if item in d1.keys():
    d1[item] += 1
  else:
    d1[item] = 1

# finally sort the dictionary of frequencies
print(dict(sorted(d1.items(), key=lambda item: item[1])))

但同样,对于您的情况,使用@Jon answer 更快更紧凑。

#...
for i in range(len(words)-1):
    #...
    #...
    for j in range(i,len(words)):
        c=words.count(x)
    #...
    if x not in d1.keys():
        #...

我试图强调您的代码在上面遇到的问题。在英语中,这看起来像:

“计算我正在查看的单词之后的每个单词出现的次数,重复计算整个列表中的每个单词。另外,查看我正在构建的整个词典再次 为列表中的每个单词,同时我正在构建它。"

这比您需要做的工作要多得多;您只需要查看列表中的每个单词一次。您 do 需要为每个单词查找一次字典,但是查看 d1.keys() 将字典转换为另一个列表并查看整个内容会使速度变慢。下面的代码将做你想做的,速度更快:

words = ['able', 'baker', 'charlie', 'dog', 'easy', 'able', 'charlie', 'dog', 'dog']

word_counts = {}

# Look at each word in our list once
for word in words:
    # If we haven't seen it before, create a new count in our dictionary
    if word not in word_counts:
        word_counts[word] = 0

    # We've made sure our count exists, so just increment it by 1
    word_counts[word] += 1

print(word_counts.items())

上面的例子将给出:

[
    ('charlie', 2),
    ('baker', 1),
    ('able', 2),
    ('dog', 3),
    ('easy', 1)
]