python平行(3):【parallel python】与【sklearn joblib的parallel和delayed】性能对比

本文对比了使用Parallel Python库和sklearn的Joblib的parallel和delayed方法进行随机森林并行训练的性能。实验表明,随着训练树数量增加,Parallel Python在效率上优于sklearn Joblib,并且当任务量较小的时候,sklearn Joblib可能是更好的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


随机森林的并行写完了。大致采用了两种方法:

1)一种是 python并行(1)中提到的joblib的parallel和delayed方法(具体实现是直接使用sklearn.externals.joblib,因为sklearn优化得很好)

2)第二种是采用http://www.parallelpython.com/的SMP


两者编程都很简单,但效率相差还是挺大的,这里大概贴出三者的编程及时间对比。

首先结论是:parallel python  好于  sklearn joblib的parallel和delayed  好于  sequential的训练。

如果你发现parallel python时间还要多于sequential的训练,那就是实现的有问题,下面我会给出一种错误实现的方式。


首先sequential的训练:

trees=[]
            start_time=time.time()
            for i in range(n_more_estimator):
                tree=MY_TreeClassifier(
                    criterion=self.criterion,
                    max_depth=self.max_depth,
                    min_leaf_split=self.min_leaf_split,
                    max_feature=self.max_feature,
                    bootstrap=self.bo
<think>我们正在讨论Python中的并行工作(parallel worker)。根据引用,有多种方式实现并行处理,包括multiprocessing.Pool、joblib.Parallel、threading.Thread以及Parallel Python (pp)包。用户可能希望了解这些方法的区别、使用场景或具体实现。 考虑到用户之前的问题引用内容,我将重点介绍几种常见的并行处理方法,并给出代码示例。同时,我会生成相关问题以引导进一步讨论。 回答结构: 1. 介绍并行处理的概念适用场景 2. 分别介绍几种并行处理方法(multiprocessing.Pool, joblib.Parallel, threading, pp) 3. 对比不同方法的适用场景 4. 生成相关问题 注意:根据系统指令,所有数学表达式代码格式要正确,使用中文回答。</think>### Python 并行工作(Parallel Worker)实现方式 在 Python 中实现并行工作主要通过多进程多线程两种模式。以下是主流实现方式及其特点: #### 1. **`multiprocessing` 模块(适合 CPU 密集型任务)** ```python from multiprocessing import Pool, Lock def worker(x): # CPU 密集型计算 return x**2 if __name__ == "__main__": with Pool(processes=4) as pool: # 创建4进程池 results = pool.map(worker, range(10)) # 并行映射 print(results) # [0, 1, 4, 9, ..., 81] ``` - **优势**:绕过 GIL 限制,充分利用多核 CPU - **注意点**:需使用 `if __name__ == "__main__"` 避免 Windows 平台错误[^1] #### 2. **`joblib.Parallel`(科学计算首选)** ```python from joblib import Parallel, delayed def process_data(data): # 数据处理逻辑 return data.upper() results = Parallel(n_jobs=4)( # 使用4个worker delayed(process_data)(text) for text in ["a", "b", "c"] ) print(results) # [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;] ``` - **特点**: - 自动内存映射优化大数据处理 - 支持进度条显示(`verbose=10`参数) - 适合 Scikit-learn 等科学计算场景[^2][^5] #### 3. **`threading` 模块(适合 I/O 密集型任务)** ```python from threading import Thread import time def io_task(url): # 模拟网络请求 time.sleep(1) return f"Data from {url}" threads = [] results = [None] * 3 for i in range(3): t = Thread(target=lambda idx=i: results.__setitem__(idx, io_task(f"url{idx}"))) t.start() threads.append(t) for t in threads: t.join() # 等待所有线程结束 print(results) # [&#39;Data from url0&#39;, ...] ``` - **适用场景**:网络请求、文件读写等 I/O 阻塞操作 - **局限**:受 GIL 限制,不适合 CPU 密集型计算[^1] #### 4. **Parallel Python (pp) 分布式计算** ```python import pp def heavy_computation(n): # 分布式计算任务 return sum(range(n)) job_server = pp.Server(ppservers=("192.168.1.10:35000",), secret="pass") job = job_server.submit( heavy_computation, # 函数 (1000000,), # 参数 (sum,), # 依赖函数 ("builtins",) # 依赖模块 ) result = job() # 获取结果 print(f"Sum: {result}") ``` - **核心能力**: - 跨机器分布式计算 - 通过 `ppserver.py -p 端口 -s 密码` 启动 worker 节点[^3][^4] - **适用场景**:集群环境下的超大规模计算 --- ### 关键选择因素 | 方式 | 最佳场景 | 数据共享方式 | GIL 影响 | |---------------------|------------------|-------------------|---------| | `multiprocessing` | CPU 密集型 | 进程间通信(IPC) | 规避 | | `threading` | I/O 密集型 | 共享内存 | 受限 | | `joblib.Parallel` | 科学计算 | 自动序列化 | 部分规避 | | `Parallel Python` | 分布式计算 | 网络传输 | 规避 | > **注意**:进程间通信成本较高,当数据量 >1GB 时建议使用 `joblib` 的 `memory_map` 或分布式框架[^5]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值