Python统计报告指定词时硬编码列表比读文件快的原因及解决方法
速度差异原因
两段代码的性能差距本质不是「从文件读词表」本身带来的,核心问题是两种实现中存储目标词的数据结构完全不同:
- 第一种代码里的
create = {'agile', 'skills'}是集合(set)类型,Python中集合的成员查询token in create的时间复杂度是O(1),无论词表长度多大,单次查询的耗时几乎恒定。 - 第二种代码里的
create = open(...).read().splitlines()是列表(list)类型,列表的成员查询需要从头遍历所有元素逐一比对,时间复杂度是O(n),n为词表长度。你实际使用的词表长度很大,再加上需要对每个文档的所有token都做查询操作,累计的耗时就会被放大很多倍,最终表现出明显的速度差异。
还有一个容易被忽略的小影响因素:如果文件中读取的词没有统一转小写、没有去除首尾空白,会导致部分匹配失败,但不会影响运行速度,只会影响统计结果准确性。
解决方法
只需要把从文件读取到的词表转成集合类型即可,改完后第二种实现的性能会和第一种完全一致,优化后的代码如下:
# 替换原create赋值逻辑,推荐用with上下文管理器避免文件句柄泄漏 with open('C:/Users/s170760/Desktop/Create.txt', 'r', encoding='UTF-8') as f: # 逐行读取词,去除首尾空白、统一转小写后存入集合 create = set(word.strip().lower() for word in f)
额外优化建议:
- 给open方法指定encoding参数,避免不同系统默认编码不一致导致读取乱码
- 对读取到的每个词做strip()处理,去掉首尾可能存在的空格、换行符等无效字符
- 统一转小写,和后续文档处理的
doc.lower()逻辑对齐,避免大小写差异导致的漏匹配
内容的提问来源于stack exchange,提问作者Mansoor
相关产品推荐
相关产品推荐

