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

如何优化Python代码高效移除300万行DataFrame中的稀有词

300万规模DataFrame稀有词过滤的性能优化方案

你的代码运行慢的核心原因有两个:

  1. 存储稀有词用的是list结构,成员判断i not in rare_word的时间复杂度是O(n),每判断一个词都要遍历整个稀有词列表,词量越大开销越高
  2. 用pandas.apply逐行执行Python原生循环,300万行的Python层循环调度、行索引访问都会带来大量额外开销

可以按改造成本从低到高选以下优化方案:

  • 优先把稀有词存储结构换成集合(set),这是投入最小、收益最高的优化
    集合的成员判断时间复杂度是O(1),仅这一步改动通常就能把整体运行耗时压缩到原来的1/10甚至更低,优化后代码:
    # 直接用集合推导式生成稀有词集合,省去列表追加的步骤
    rare_word_set = {word for word, cnt in frequency_word.items() if cnt <= 1}
    df['description'] = df['description'].apply(lambda x: [token for token in x if token not in rare_word_set])
    
  • 绕开pandas apply的额外开销,直接用原生列表推导处理
    apply本质还是逐行调用Python函数,pandas的行对象包装、索引校验都会拖慢速度,可以直接把列转成Python原生列表处理完再赋值,通常能比原生apply快30%左右:
    rare_word_set = {word for word, cnt in frequency_word.items() if cnt <= 1}
    df['description'] = [
        [token for token in desc if token not in rare_word_set]
        for desc in df['description'].tolist()
    ]
    
  • 借助专用加速库减少Python层循环开销
    如果内存充足,可以用swifter自动把apply逻辑转成pandas支持的更快执行路径,或者用numpy向量化逻辑进一步压缩耗时,示例代码:
    import swifter
    rare_word_set = {word for word, cnt in frequency_word.items() if cnt <= 1}
    df['description'] = df['description'].swifter.apply(
        lambda x: [token for token in x if token not in rare_word_set]
    )
    
  • 数据量极大时用多进程并行处理
    如果单进程跑耗时还是太长,可以把DataFrame拆成多个分片,用多进程并行执行过滤逻辑,充分利用多核CPU性能,注意要把稀有词集合设置为进程全局变量,避免多进程间重复序列化大对象带来额外开销。

优化提示:过滤逻辑里不要加多余的类型转换、异常捕获等操作,所有文本预处理步骤提前跑完再做稀有词过滤,能进一步减少不必要的性能损耗。

内容的提问来源于stack exchange,提问作者sudojarvis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:45:31