You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效统计大量JSON文件中word字段的总词汇数量

现有代码的核心瓶颈

你当前的代码速度慢主要来自两个层面:

  1. 单词计数逻辑冗余:split()会生成临时的单词列表,大量计算场景下,创建/销毁临时列表的开销远高于计数本身
  2. 多文件处理时的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:27:03