930 python平行計算框架pathos模組

2021-10-11 18:34:50 字數 3460 閱讀 6414

應用python進行資料探勘或計算時,往往需要遍歷多種引數進行資料建模,而單次的建模或計算有時候非常耗時,這時候可以利用python的平行計算功能,加快計算速度。

python能夠應用平行計算的模組有多個multiprocessing、pathos等。其中multiprocessing模組應用的較多,但對於資料探勘場景來說,pathos模組更實用,尤其允許輸入多個可變引數非常簡單實用。

1.環境&軟體

2.功能實現

本文總結整理了常見的平行計算場景,編寫parallel.py模組,主要利用pathos模組實現,可以實現單變數並行、多變數並行、並行巢狀等功能。通過tdqm模組增加了進度條,可以顯示計算進度等資訊,通過functools模組中的partial函式將靜態引數凍結,以適應並行框架。

pip install pathos
# -*- coding:utf-8 -*-

import time

from functools import partial

from pathos.pools import processpool, threadpool

from tqdm import tqdm

def parallel(func, *args, show=false, thread=false, **kwargs):

"""平行計算

:param func: 函式,必選引數

:param args: list/tuple/iterable,1個或多個函式的動態引數,必選引數

:param show:bool,預設false,是否顯示計算進度

:param thread:bool,預設false,是否為多執行緒

:param kwargs:1個或多個函式的靜態引數,key-word形式

:return:list,與函式動態引數等長

"""# 凍結靜態引數

p_func = partial(func, **kwargs)

# 開啟程序/執行緒池

pool = threadpool() if thread else processpool()

try:

if show:

start = time.time()

# imap方法

with tqdm(total=len(args[0]), desc="計算進度") as t: # 進度條設定

r =

for i in pool.imap(p_func, *args):

t.set_postfix()

t.update()

else:

# map方法

r = pool.map(p_func, *args)

return r

except exception as e:

print(e)

finally:

# 關閉池

pool.close() # close the pool to any new jobs

pool.join() # cleanup the closed worker processes

pool.clear() # remove server with matching state

函式parallel的引數定義順序需要注意:必選引數–任意位置引數–預設引數–任意關鍵字引數

3.結果展示

定義另乙個parallel_main.py模組,用來展示各個場景下平行計算結果。

# -*- coding:utf-8 -*-

from parallel import parallel

class a:

@staticmethod

def f1(x):

return x + 1

@staticmethod

def f2(x, y):

return x + y

@staticmethod

def f3(x, y, p=100):

return x + y + p

@staticmethod

def f4(x):

import time

time.sleep(1)

return x + 1

def f5(self, x):

r = parallel(self.f1, [1, 2, 3], thread=true) # [2,3,4]

return x + sum(r)

def f6(self, x):

r1 = parallel(self.f1, [1, 2, 3], thread=true) # [2,3,4]

r2 = parallel(self.f2, [1, 2, 3], r1, thread=true) # [3,5,7]

return x + sum(r2)

if __name__ == '__main__':

f = a()

print("f1計算結果(單引數並行模式):", parallel(f.f1, [1, 2, 3]), "\n", "#" * 50)

print("f2計算結果(多引數並行模式):", parallel(f.f2, [1, 2, 3], [4, 5, 6]), "\n", "#" * 50)

print("f3計算結果(多引數並行+函式引數模式):", parallel(f.f3, [1, 2, 3], [4, 5, 6], p=200), "\n", "#" * 50)

print("f4計算結果(進度顯示):", parallel(f.f4, range(100), show=true), "\n", "#" * 50)

print("f5計算結果(2層巢狀並行模式):", parallel(f.f5, range(10)), "\n", "#" * 50)

print("f6計算結果(多層巢狀並行模式):", parallel(f.f6, range(10)), "\n", "#" * 50)

執行parallel_main.py檔案,結果如下:

4.總結&歸納

parallel函式使用注意點:

(1)函式至少輸入乙個被並行函式,和可迭代序列引數

(2)要顯示計算過程,設定show=true

(3)被並行函式的依賴模組需要匯入,否則報nameerror

(4)巢狀並行需要匯入parallel模組,且子並行需要設定為多執行緒模式(thread=true)

python平行計算 python平行計算

0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...

Spark 平行計算框架

spark是乙個通用的平行計算框架,是一種快速處理大規模資料的通用引擎,由ucberkeley的amp實驗室開發。其架構如下圖所示 spark的中間資料放到記憶體中,對於迭代運算效率比較高 spark比hadoop更通用 效能與速度 容錯性 可用性 spark可以直接對hdfs進行資料的讀寫,同樣支...

CUDA平行計算框架程式設計 矩陣相乘平行計算

當下的gpgpu general purpose gpu graphic process unit cuda compute unified device architecture 即通用計算圖形處理器。安裝過程可參考我的另一篇blog cuda軟體架構 1 開發庫 cuda library 2 執...