應用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 執...