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

提升Pandas列函数应用性能的最优方法咨询

Pandas列批量应用函数的性能优化方案(千万级数据场景)

针对2000万行规模的数据,df["title"].apply(word_tokenize)这类逐行操作的性能瓶颈主要来自Python循环的开销,以下是实用的优化方法:

1. 优先使用工具库的批量/矢量化接口

大部分NLP工具都提供了批量处理接口,避免逐行调用的额外开销:

  • 用spaCy的pipe方法批量处理,支持多进程加速:
    import spacy
    # 禁用不需要的组件(如parser、ner)以减少计算开销
    nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"])
    # batch_size控制单次处理量,n_process=-1使用全部CPU核心
    df["title"] = [doc.text.split() for doc in nlp.pipe(df["title"], batch_size=1000, n_process=-1)]
    
  • 替换为更快的Tokenizer,比如OpenAI的tiktoken(基于Rust实现,速度远快于纯Python工具):
    import tiktoken
    tokenizer = tiktoken.get_encoding("cl100k_base")
    df["title"] = df["title"].apply(lambda x: tokenizer.encode(x, allowed_special="all"))
    

2. 用Pandas内置str方法替代自定义函数

如果只是简单的字符串分割(类似空格分词),直接用Pandas原生str方法——底层基于C实现,性能比apply高几个数量级:

df["title"] = df["title"].str.split()

3. 多进程/多线程加速apply

用swifter自动选择最优执行方式

swifter库会自动判断函数是否可矢量化,否则自动启用多进程执行:

import swifter
df["title"] = df["title"].swifter.apply(word_tokenize)

手动分块多进程处理

自己控制数据分块和进程数,适合依赖复杂的自定义函数:

from multiprocessing import Pool
import numpy as np
import pandas as pd

def process_chunk(chunk):
    # 注意:子进程中需重新初始化依赖(如Tokenizer)
    return chunk.apply(word_tokenize)

# 按CPU核心数分块,充分利用硬件资源
chunks = np.array_split(df["title"], 8)
with Pool(8) as p:
    processed_chunks = p.map(process_chunk, chunks)
df["title"] = pd.concat(processed_chunks)

4. 转换为NumPy数组降低循环开销

Pandas Series底层是NumPy数组,转成数组后用np.vectorize减少Python层循环的开销:

import numpy as np
vec_tokenize = np.vectorize(word_tokenize)
df["title"] = vec_tokenize(df["title"].to_numpy())

5. 用Dask处理超大规模数据

如果数据超出内存容量,用Dask DataFrame分块并行处理,避免内存溢出:

import dask.dataframe as dd
# 按内存情况设置分区数,平衡并行效率和内存占用
ddf = dd.from_pandas(df, npartitions=8)
# meta指定返回类型,避免Dask推断错误
ddf["title"] = ddf["title"].apply(word_tokenize, meta=object)
# 计算结果并转回Pandas DataFrame
df = ddf.compute()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:27:17