如何优化Python代码高效移除300万行DataFrame中的稀有词
300万规模DataFrame稀有词过滤的性能优化方案
你的代码运行慢的核心原因有两个:
- 存储稀有词用的是
list结构,成员判断i not in rare_word的时间复杂度是O(n),每判断一个词都要遍历整个稀有词列表,词量越大开销越高 - 用
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
相关产品推荐
相关产品推荐

