如何高效统计大量JSON文件中word字段的总词汇数量
现有代码的核心瓶颈
你当前的代码速度慢主要来自两个层面:
- 单词计数逻辑冗余:
split()会生成临时的单词列表,大量计算场景下,创建/销毁临时列表的开销远高于计数本身 - 多文件处理时的IO和JSON解析开销:如果目录下JSON文件数量多、体积大,这部分的耗时会远高于计数逻辑的耗时
优化方案
1. 替换单词计数逻辑(无额外依赖,改造成本最低)
单词的数量等于字符串中空格的数量+1,完全不需要切割生成列表,直接统计空格数量即可,该优化能让计数逻辑速度提升3~5倍:
total = 0 for obj in objects: word_str = obj["word"].strip() # 兼容空字符串、首尾带空格的场景 total += word_str.count(" ") + 1 if word_str else 0
2. 用C实现的内置函数替换Python层循环
Python内置的sum()函数是C语言实现的,比手动写for循环累加快20%左右,搭配生成器表达式可以直接一行完成统计:
total = sum((obj["word"].strip().count(" ") + 1) if obj["word"].strip() else 0 for obj in objects)
3. 优化JSON解析与多文件处理(针对大量JSON文件场景,提升最明显)
如果你的瓶颈出在多文件批量处理环节,建议用多进程利用多核CPU并行解析文件,不要用多线程(GIL会限制CPU密集型任务的性能),参考代码如下:
from multiprocessing import Pool import os import json def count_single_file(file_path): with open(file_path, 'r', encoding='utf-8') as f: obj_list = json.load(f) return sum((obj["word"].strip().count(" ") + 1) if obj["word"].strip() else 0 for obj in obj_list) if __name__ == "__main__": json_folder_path = "替换为你的JSON目录路径" all_json_files = [os.path.join(json_folder_path, filename) for filename in os.listdir(json_folder_path) if filename.endswith(".json")] # 进程数设置为CPU核心数即可 with Pool(processes=os.cpu_count()) as pool: total_word_count = sum(pool.map(count_single_file, all_json_files)) print(f"总单词数:{total_word_count}")
4. 极端大数据量优化
如果你的JSON文件总大小超过100GB、文件数量超过十万级,可以直接用PyPy运行上述代码,无需修改代码就能获得3~10倍的性能提升。如果是单个超大JSON文件,建议用ijson这类流式JSON解析库,不用全量加载文件到内存,进一步降低IO开销。
内容的提问来源于stack exchange,提问作者Joey Joestar
相关产品推荐
相关产品推荐

