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

优化Spacy与CSV导出代码:parsetext方法提速需求

优化Spacy + Pandas文本处理代码的实用建议

嘿,我来帮你优化这段用Spacy和Pandas处理文本的代码,尤其是针对parsetext(df)方法耗时2-3秒的问题,给你几个实打实的提速和整体优化方案:

核心提速优化点

1. 避免重复加载Spacy模型

你现在把nlp = spacy.load("en_core_web_sm")放在parsetext函数里,每次调用函数都会重新加载一次模型——这是非常浪费资源的操作!模型加载本身就需要时间,把它移到函数外面,全局初始化一次就够了。

2. 用Spacy批量处理代替逐行调用

Spacy的nlp.pipe()专门用来批量处理文本,性能比逐行调用nlp()高很多,还能通过n_process参数开启多线程(建议设置为CPU核心数,比如n_process=2或4),充分利用硬件资源。

3. 替换低效的iterrows()

Pandas的iterrows()是出了名的慢,完全可以结合nlp.pipe直接批量处理整个文本列,或者用apply方法,效率会提升一大截。

4. 简化停用词过滤逻辑

不用逐词判断word.is_stop==False,可以用更简洁的列表推导式,代码更简洁的同时也能提升一点效率。

整体代码优化细节

  • 填充空值可以一次性处理多列,不用分开写两次fillna,让代码更紧凑
  • 导出CSV时,用pathlib代替sys.path[0]拼接路径,更优雅且跨平台
  • 给函数添加明确的参数和返回值,让代码更灵活、可读性更强
  • 可以添加简单的类型提示,方便后续维护

优化后的代码示例

import sys
import pandas as pd
import spacy
from pathlib import Path

# 全局初始化Spacy模型,只加载一次
nlp = spacy.load("en_core_web_sm")

def parsetext(df, text_col: str = "Column1Text") -> pd.DataFrame:
    # 用nlp.pipe批量处理文本,开启多线程
    docs = nlp.pipe(df[text_col].astype(str), n_process=2)
    
    # 批量过滤停用词,生成tokens列
    df["Tokens"] = [
        [token for token in doc if not token.is_stop]
        for doc in docs
    ]
    df["Processed"] = 0
    return df

def main():
    # 处理输入路径
    input_path = sys.argv[1]
    df = pd.read_excel(input_path, sheet_name='Sheet1', header=None)
    df.columns = ["Column1Text","Column2Text","C3","C4","C5","C6","C7"]
    
    # 一次性填充多列空值
    df[["Column1Text", "Column2Text"]] = df[["Column1Text", "Column2Text"]].fillna('')
    
    # 调用处理函数
    df = parsetext(df)
    
    # 用pathlib生成输出路径
    output_path = Path(sys.path[0]) / "parsed_file.csv"
    df[['Column1Text', 'Column2Text','Tokens','Processed']].to_csv(
        output_path, index=None, header=True
    )

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:52:58