網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1 前言
我們?cè)谌粘J褂肞ython進(jìn)行各種數(shù)據(jù)計(jì)算處理任務(wù)時(shí),若想要獲得明顯的計(jì)算加速效果,最簡(jiǎn)單明了的方式就是想辦法將默認(rèn)運(yùn)行在單個(gè)進(jìn)程上的任務(wù),擴(kuò)展到使用多進(jìn)程或多線程的方式執(zhí)行。
而對(duì)于我們這些從事數(shù)據(jù)分析工作的人員而言,以最簡(jiǎn)單的方式實(shí)現(xiàn)等價(jià)的加速運(yùn)算的效果尤為重要,從而避免將時(shí)間過(guò)多花費(fèi)在編寫(xiě)程序上。
而今天我就來(lái)帶大家學(xué)習(xí)如何利用joblib這個(gè)非常簡(jiǎn)單易用的庫(kù)中的相關(guān)功能,來(lái)快速實(shí)現(xiàn)并行計(jì)算加速效果。
2 使用joblib進(jìn)行并行計(jì)算
作為一個(gè)被廣泛使用的第三方Python庫(kù)(譬如scikit-learn項(xiàng)框架中就大量使用joblib進(jìn)行眾多機(jī)器學(xué)習(xí)算法的并行加速),我們可以使用pip install joblib對(duì)其進(jìn)行安裝,安裝完成后,下面我們來(lái)學(xué)習(xí)一下joblib中有關(guān)并行運(yùn)算的常用方法:
2.1 使用Parallel與delayed進(jìn)行并行加速
joblib中實(shí)現(xiàn)并行計(jì)算只需要使用到其Parallel和delayed方法即可,使用起來(lái)非常簡(jiǎn)單方便
下面我們直接以一個(gè)小例子來(lái)演示:
joblib實(shí)現(xiàn)并行運(yùn)算的思想是將一組通過(guò)循環(huán)產(chǎn)生的串行計(jì)算子任務(wù),以多進(jìn)程或多線程的方式進(jìn)行調(diào)度,而我們針對(duì)自定義的運(yùn)算任務(wù)需要做的僅僅是將它們封裝為函數(shù)的形式即可,譬如:
import time
def task_demo1():
? ? time.sleep(1)
? ? return time.time()
接著只需要像下面的形式一樣,為Parallel()設(shè)置相關(guān)參數(shù)后,銜接循環(huán)創(chuàng)建子任務(wù)的列表推導(dǎo)過(guò)程,其中利用delayed()包裹自定義任務(wù)函數(shù),再銜接()傳遞任務(wù)函數(shù)所需的參數(shù)即可,其中n_jobs參數(shù)用于設(shè)置并行任務(wù)同時(shí)執(zhí)行的worker數(shù)量,因此在這個(gè)例子中可以看到進(jìn)度條是按照4個(gè)一組遞增的,
可以看到最終時(shí)間開(kāi)銷(xiāo)也達(dá)到了并行加速效果:
其中可以根據(jù)計(jì)算任務(wù)以及機(jī)器CPU核心數(shù)具體情況為Parallel()調(diào)節(jié)參數(shù),核心參數(shù)有:
- backend:用于設(shè)置并行方式,其中多進(jìn)程方式有'loky'(更穩(wěn)定)和'multiprocessing'兩種可選項(xiàng),多線程有'threading'一種選項(xiàng)。默認(rèn)為'loky'
- n_jobs:用于設(shè)置并行任務(wù)同時(shí)執(zhí)行的worker數(shù)量,當(dāng)并行方式為多進(jìn)程時(shí),n_jobs最多可設(shè)置為機(jī)器CPU邏輯核心數(shù)量,超出亦等價(jià)于開(kāi)啟全部核心,你也可以設(shè)置為-1來(lái)快捷開(kāi)啟全部邏輯核心,若你不希望全部CPU資源均被并行任務(wù)占用,則可以設(shè)置更小的負(fù)數(shù)來(lái)保留適當(dāng)?shù)目臻e核心,譬如設(shè)置為-2則開(kāi)啟全部核心-1個(gè)核心,設(shè)置為-3則開(kāi)啟全部核心-2個(gè)核心
譬如下面的例子,在我這臺(tái)邏輯核心數(shù)為8的機(jī)器上,保留兩個(gè)核心進(jìn)行并行計(jì)算:
關(guān)于并行方式的選擇上,由于Python中多線程時(shí)全局解釋器鎖的限制,如果你的任務(wù)是計(jì)算密集型,則推薦使用默認(rèn)的多進(jìn)程方式加速,如果你的任務(wù)是IO密集型譬如文件讀寫(xiě)、網(wǎng)絡(luò)請(qǐng)求等,則多線程是更好的方式且可以將n_jobs設(shè)置的很大,舉個(gè)簡(jiǎn)單的例子,可以看到,通過(guò)多線程并行,我們?cè)?秒的時(shí)間里完成了1000次請(qǐng)求,遠(yuǎn)快于單線程17秒請(qǐng)求100次的成績(jī)
我們可以根據(jù)自己實(shí)際任務(wù)的不同,好好利用joblib來(lái)加速你的日常工作。
原文鏈接:https://blog.csdn.net/qq_34160248/article/details/124822371
相關(guān)推薦
- 2022-05-14 C++?STL中vector容器的使用_C 語(yǔ)言
- 2022-03-18 C語(yǔ)言計(jì)算字符串最后一個(gè)單詞的長(zhǎng)度_C 語(yǔ)言
- 2022-05-15 C++設(shè)計(jì)模式中的觀察者模式一起來(lái)看看_C 語(yǔ)言
- 2022-09-13 Python實(shí)現(xiàn)創(chuàng)建模塊的方法詳解_python
- 2022-04-15 關(guān)于pyinstaller生成.exe程序報(bào)錯(cuò):缺少.ini文件的分析_python
- 2022-02-18 取一個(gè)數(shù)組中想要的值,放到一個(gè)新的對(duì)象里
- 2022-04-08 Python裝飾器中@property使用詳解_python
- 2022-05-11 Synchronized鎖優(yōu)化
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支