Python词频统计代码小样本正常 大数据量运行无结果问题咨询
运行超时原因
你写的代码时间复杂度过高,是大数据量下无法跑完的核心问题:
- 代码整体时间复杂度为O(n²):你嵌套了两层循环,同时内层循环中调用的
words.count(x)本身也要遍历整个words列表计算频次,相当于每统计一个单词就要遍历全列表n次,10万条数据对应要执行100亿次操作,70万条更是要执行4900亿次操作,运行超过24小时是正常的。 - 冗余逻辑进一步拖慢速度:内层
for j in range(i,len(words))循环完全是无效操作,每次循环都重复给变量c赋相同的值,平白多执行了n次空循环。 - 额外查询开销:判断
x not in d1.keys()在部分旧版Python中也是O(n)级别的操作,又额外增加了运行耗时。
优化解决方案
方案1:使用Python内置collections.Counter(最推荐,性能最优)
Python官方自带的频次统计工具,底层做了C级优化,时间复杂度仅为O(n),处理百万级数据秒出结果:
from collections import Counter # 一步完成所有单词的频次统计 word_counter = Counter(words) # 输出出现频次最高的前N个单词,比如取前23个和你之前的测试输出对应 top_words = word_counter.most_common(23) print(top_words) # 如果需要返回字典格式,直接调用dict(word_counter)即可
方案2:手动实现高效统计逻辑(不想依赖内置库的场景)
仅遍历一次单词列表即可完成统计,没有嵌套循环,时间复杂度同样为O(n):
d1 = {} for word in words: if word in d1: d1[word] += 1 else: d1[word] = 1 # 按频次从高到低排序取前23个 top_words = sorted(d1.items(), key=lambda x: x[1], reverse=True)[:23] print(top_words)
以上两种方案处理10万条数据仅需几毫秒,70万条数据也能在1秒内跑完。
内容的提问来源于stack exchange,提问作者Paul Engelbert
相关产品推荐
相关产品推荐

