Python中最簡單易用的並行加速技巧

--

文章來於:費弗裏 Python大數據分析

本文示例程式碼及檔案已上傳至我的Github倉庫

https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

我們在日常使用 Python 進行各種資料計算處理任務時,若想要獲得明顯的計算加速效果,最簡單明瞭的方式就是想辦法將預設執行在單個程序上的任務,擴充套件到使用多程序或多執行緒的方式執行。

而對於我們這些從事資料分析工作的人員而言,以最簡單的方式實現等價的加速運算的效果尤為重要,從而避免將時間過多花費在編寫程式上。而今天的文章就來帶大家學習如何利用 joblib 這個非常簡單易用的庫中的相關功能,來快速實現平行計算加速效果。

2 使用joblib進行平行計算

作為一個被廣泛使用的第三方 Python 庫(譬如 scikit-learn 項框架中就大量使用 joblib 進行眾多機器學習演算法的並行加速),我們可以使用 pip install joblib 對其進行安裝,安裝完成後,下面我們來學習一下 joblib 中有關並行運算的常用方法:

2.1 使用Parallel與delayed進行並行加速

joblib中實現平行計算只需要使用到其Parallel和delayed方法即可,使用起來非常簡單方便,下面我們直接以一個小例子來演示:

joblib實現並行運算的思想是將一組透過迴圈產生的序列計算子任務,以多程序或多執行緒的方式進行排程,而我們針對自定義的運算任務需要做的僅僅是將它們封裝為函式的形式即可,譬如:

import time

def task_demo1():

time.sleep(1)

return time.time()

接著只需要像下面的形式一樣,為Parallel()設定相關引數後,銜接迴圈建立子任務的列表推導過程,其中利用delayed()包裹自定義任務函式,再銜接()傳遞任務函式所需的引數即可,其中n_jobs引數用於設定並行任務同時執行的worker數量,因此在這個例子中可以看到進度條是按照4個一組遞增的,可以看到最終時間開銷也達到了並行加速效果:

其中可以根據計算任務以及機器CPU核心數具體情況為Parallel()調節引數,核心引數有:

backend:用於設定並行方式,其中多程序方式有‘loky’(更穩定)和‘multiprocessing’兩種可選項,多執行緒有‘threading’一種選項。預設為‘loky’

n_jobs:用於設定並行任務同時執行的worker數量,當並行方式為多程序時,n_jobs最多可設定為機器CPU邏輯核心數量,超出亦等價於開啟全部核心,你也可以設定為-1來快捷開啟全部邏輯核心,若你不希望全部CPU資源均被並行任務佔用,則可以設定更小的負數來保留適當的空閒核心,譬如設定為-2則開啟全部核心-1個核心,設定為-3則開啟全部核心-2個核心

譬如下面的例子,在我這臺邏輯核心數為8的機器上,保留兩個核心進行平行計算:

關於並行方式的選擇上,由於Python中多執行緒時全域性直譯器鎖的限制,如果你的任務是計算密集型,則推薦使用預設的多程序方式加速,如果你的任務是IO密集型譬如檔案讀寫、網路請求等,則多執行緒是更好的方式且可以將n_jobs設定的很大,舉個簡單的例子,可以看到,透過多執行緒並行,我們在5秒的時間裡完成了1000次請求,遠快於單執行緒17秒請求100次的成績(此例僅供參考,大家在學習嘗試時請不要過於頻繁訪問他人的網站):

你可以根據自己實際任務的不同,好好利用joblib來加速你的日常工作。

原文連接:https://mp.weixin.qq.com/s/taoYBdUE_q_S_4Pea-97rw

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

餅圖變形記,肝了3000字,收藏就是學會!

MySQL必須掌握4種語言!

太實用了!4種方法教你輕鬆製作互動式儀表板!

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

妙呀!一行Python程式碼

--

--

數據分析那些事
數據分析那些事

Written by 數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

No responses yet