Python 3.6.4下如何高效解析两个大文本文件中的词汇?
嘿,作为新手能写出可运行的代码已经很棒了!针对你遇到的效率问题和代码风格,我整理了一些实用的优化建议:
一、效率优化:让大文本处理快起来
从你给出的代码片段来看,核心瓶颈大概率在字典查找速度、字符串累加和文件IO操作上,这几个调整能帮你把处理时间从分钟级压缩到秒级:
- 用集合替代列表存储字典词:列表的
in操作是逐个遍历(时间复杂度O(n)),而集合的查找是哈希匹配(O(1))。把字典加载成集合,比如:with open(dict_file_path, 'r') as dict_file: # 去掉空行,统一转小写避免大小写匹配问题 word_set = set(line.strip().lower() for line in dict_file if line.strip()) - 避免字符串累加操作:你代码里的
realWords = ''如果是用来循环拼接结果的,一定要改成用列表收集内容——字符串是不可变对象,每次+=都会生成新字符串,大数据量下慢到离谱。最后用''.join(result_list)合并,速度会提升几十倍。 - 减少文件IO次数:尽量批量读取/写入内容,比如用
writelines()一次性写入所有结果,而不是循环里逐行写;逐行处理文本时也不要在循环里做写入操作。
这里给你一个优化后的示例片段,你可以参考调整:
def filter_real_words(input_file, dict_file, output_file): # 第一步:加载字典为集合,提升查找速度 with open(dict_file, 'r') as f: valid_words = set(line.strip().lower() for line in f if line.strip()) # 第二步:处理输入文本,用列表收集有效内容 result_lines = [] with open(input_file, 'r') as f: for line in f: # 假设你是拆分每行的词,筛选有效词后保留整行格式 line_words = line.split() filtered_words = [word for word in line_words if word.lower() in valid_words] if filtered_words: result_lines.append(' '.join(filtered_words) + '\n') # 第三步:批量写入结果 with open(output_file, 'w') as f: f.writelines(result_lines)
二、代码风格改进建议
作为新手,养成好的编码习惯会让你后续进阶更顺畅:
- 参数和变量命名要清晰:比如
inFile可以改成input_file(蛇形命名是Python的规范),而且你之前代码里把文件对象命名为dictionary,和参数名重名了,这会覆盖参数引用,是个潜在bug,一定要避免。 - 拆分大函数:如果你的函数里有多个逻辑(加载字典、处理文本、写入结果),可以拆成独立的小函数,比如
load_dictionary()、process_text(),这样代码更易读、好维护。 - 添加文档字符串:给函数加个说明,方便自己以后看,也方便别人理解:
def filter_real_words(input_file, dict_file, output_file): """从输入文本中筛选出存在于指定字典中的词汇,写入输出文件。 Args: input_file (str): 待处理的文本文件路径 dict_file (str): 字典文件路径(每行一个词汇) output_file (str): 结果输出文件路径 """ - 分开处理文件操作:你之前同时打开三个文件的写法虽然合法,但逻辑上分开处理会更清晰,也更容易排查问题。
额外小提示
如果你的小说文件特别大(比如几百MB),逐行处理是最优选择,不会占用太多内存;如果文件不大,一次性f.read()读取整个内容再处理会更快。另外,记得统一词汇的大小写,避免因为字典是"Apple"、文本是"apple"导致的匹配失败。
内容的提问来源于stack exchange,提问作者Mars




