Python?并行加速技巧分享
1 前言
我們在日常使用Python進行各種數(shù)據(jù)計算處理任務(wù)時,若想要獲得明顯的計算加速效果,最簡單明了的方式就是想辦法將默認運行在單個進程上的任務(wù),擴展到使用多進程或多線程的方式執(zhí)行。
而對于我們這些從事數(shù)據(jù)分析工作的人員而言,以最簡單的方式實現(xiàn)等價的加速運算的效果尤為重要,從而避免將時間過多花費在編寫程序上。
而今天我就來帶大家學(xué)習(xí)如何利用joblib這個非常簡單易用的庫中的相關(guān)功能,來快速實現(xiàn)并行計算加速效果。

2 使用joblib進行并行計算
作為一個被廣泛使用的第三方Python庫(譬如scikit-learn項框架中就大量使用joblib進行眾多機器學(xué)習(xí)算法的并行加速),我們可以使用pip install joblib對其進行安裝,安裝完成后,下面我們來學(xué)習(xí)一下joblib中有關(guān)并行運算的常用方法:
2.1 使用Parallel與delayed進行并行加速
joblib中實現(xiàn)并行計算只需要使用到其Parallel和delayed方法即可,使用起來非常簡單方便
下面我們直接以一個小例子來演示:
joblib實現(xiàn)并行運算的思想是將一組通過循環(huán)產(chǎn)生的串行計算子任務(wù),以多進程或多線程的方式進行調(diào)度,而我們針對自定義的運算任務(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)過程,其中利用delayed()包裹自定義任務(wù)函數(shù),再銜接()傳遞任務(wù)函數(shù)所需的參數(shù)即可,其中n_jobs參數(shù)用于設(shè)置并行任務(wù)同時執(zhí)行的worker數(shù)量,因此在這個例子中可以看到進度條是按照4個一組遞增的,
可以看到最終時間開銷也達到了并行加速效果:

其中可以根據(jù)計算任務(wù)以及機器CPU核心數(shù)具體情況為Parallel()調(diào)節(jié)參數(shù),核心參數(shù)有:
- backend:用于設(shè)置并行方式,其中多進程方式有'loky'(更穩(wěn)定)和'multiprocessing'兩種可選項,多線程有'threading'一種選項。默認為'loky'
- n_jobs:用于設(shè)置并行任務(wù)同時執(zhí)行的worker數(shù)量,當(dāng)并行方式為多進程時,n_jobs最多可設(shè)置為機器CPU邏輯核心數(shù)量,超出亦等價于開啟全部核心,你也可以設(shè)置為-1來快捷開啟全部邏輯核心,若你不希望全部CPU資源均被并行任務(wù)占用,則可以設(shè)置更小的負數(shù)來保留適當(dāng)?shù)目臻e核心,譬如設(shè)置為-2則開啟全部核心-1個核心,設(shè)置為-3則開啟全部核心-2個核心
譬如下面的例子,在我這臺邏輯核心數(shù)為8的機器上,保留兩個核心進行并行計算:

關(guān)于并行方式的選擇上,由于Python中多線程時全局解釋器鎖的限制,如果你的任務(wù)是計算密集型,則推薦使用默認的多進程方式加速,如果你的任務(wù)是IO密集型譬如文件讀寫、網(wǎng)絡(luò)請求等,則多線程是更好的方式且可以將n_jobs設(shè)置的很大,舉個簡單的例子,可以看到,通過多線程并行,我們在5秒的時間里完成了1000次請求,遠快于單線程17秒請求100次的成績

我們可以根據(jù)自己實際任務(wù)的不同,好好利用joblib來加速你的日常工作。
到此這篇關(guān)于Python 并行加速技巧分享的文章就介紹到這了,更多相關(guān)Python 加速內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python初學(xué)時購物車程序練習(xí)實例(推薦)
下面小編就為大家?guī)硪黄狿ython初學(xué)時購物車程序練習(xí)實例(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
使用Python模擬操作windows應(yīng)用窗口詳解
在日常工作中,我們經(jīng)常遇到需要進行大量重復(fù)性任務(wù)的情況,這篇文章將介紹如何使用 Python 模擬操作記事本,感興趣的小伙伴可以了解下2025-02-02
Python網(wǎng)絡(luò)爬蟲出現(xiàn)亂碼問題的解決方法
這篇文章主要為大家詳細介紹了Python網(wǎng)絡(luò)爬蟲出現(xiàn)亂碼問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Python將視頻或者動態(tài)圖gif逐幀保存為圖片的方法
本文是基于opencv將視頻和動態(tài)圖gif保存為圖像幀的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧2019-09-09

