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

Python多进程处理矩阵不同行耗时高于单进程的问题咨询

问题解答

首先明确:每个进程修改矩阵不同部分的操作,不是多进程效率不升反降的原因,性能问题来自以下几个核心错误:

1. 全局代码未加if __name__ == '__main__'保护,重复执行开销极大

Python multiprocessing默认的spawn启动模式下,每个子进程启动时都会重新导入主模块、执行所有全局作用域的代码。你当前把超大矩阵生成、Process实例化、计时起点都放在了if __name__ == '__main__'之外,意味着每个子进程启动时都会重新生成一次15000×15000的矩阵、重复实例化3个Process对象,这部分额外开销已经远超计算本身的耗时。

2. 进程间数据拷贝开销远大于计算收益

你传递给子进程的DataFrame分片需要经过pickle序列化、跨进程传输、反序列化三个步骤才能被子进程读取,而你测试用的df+3是numpy底层高度优化的向量化运算,单进程执行时已经用上了CPU的SIMD指令,耗时极短,多进程的收益完全被数据拷贝、进程调度的开销抵消。只有当你的每行计算逻辑是很重的自定义Python代码时,多进程才会有明显收益。

3. 计时逻辑错误

计时起点start=time.time()写在if __name__ == '__main__'之外,子进程启动时也会执行这行代码,最终统计的时间包含了所有子进程初始化、全局代码执行的额外耗时,并非真实的多进程计算耗时。

修复后的参考代码
import multiprocessing, os
import time, pandas as pd, numpy as np

def mat_proc(df):
    print("ID of process running worker: {}".format(os.getpid()))
    return df + 3  # 简化的处理逻辑
          
if __name__ == '__main__':   
    count = 5000
    # 所有全局初始化逻辑都放到main保护内
    df = pd.DataFrame(np.random.randint(0,10,size=(3*count,3*count)),dtype='int8')
    slice1 = df.iloc[0:count,]
    slice2 = df.iloc[count:2*count,]
    slice3 = df.iloc[2*count:3*count,]
    
    p1 = multiprocessing.Process(target=mat_proc,args=(slice1,))
    p2 = multiprocessing.Process(target=mat_proc,args=(slice2,))
    p3 = multiprocessing.Process(target=mat_proc,args=(slice3,))
    
    start = time.time()
    print('started now')
    # 单进程对照测试:
    # mat_proc(df)
    
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    
    finish = time.time()
    print(f'total time taken {round(finish-start,2)}')

额外优化建议
  • 如果你的计算逻辑可以用numpy/pandas原生向量化实现,优先用向量化运算,性能远高于手动多进程拆分。
  • 如果必须用多进程处理自定义的重行级计算,建议使用multiprocessing.Pool而非手动创建Process,同时可以用共享内存存储矩阵,避免进程间数据拷贝的开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:04