[930]python平行計算框架pathos模組
應用python進行資料探勘或計算時,往往需要遍歷多種引數進行資料建模,而單次的建模或計算有時候非常耗時,這時候可以利用python的平行計算功能,加快計算速度。
python能夠應用平行計算的模組有多個multiprocessing、pathos等。其中multiprocessing模組應用的較多,但對於資料探勘場景來說,pathos模組更實用,尤其允許輸入多個可變引數非常簡單實用。
1.環境&軟體
- win10 64bit
- Python 3.7
2.功能實現
本文總結整理了常見的平行計算場景,編寫parallel.py模組,主要利用pathos模組實現,可以實現單變數並行、多變數並行、並行巢狀等功能。通過tdqm模組增加了進度條,可以顯示計算進度等資訊,通過functools模組中的partial函式將靜態引數凍結,以適應並行框架。
- 安裝
pip install pathos
- parallel.py
# -*- 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):
r.append(i)
t.set_postfix({'並行函式': func.__name__, "計算花銷": "%ds" % (time.time() - start)})
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模組,用來展示各個場景下平行計算結果。
- 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)
來源:https://zhuanlan.zhihu.com/p/102451932
相關文章
- [python] Python平行計算庫Joblib使用指北Python
- 平行計算π值
- springboot~CompletableFuture平行計算Spring Boot
- Concurrent iHawk — 實時平行計算機模擬系統計算機
- java8平行計算Java
- 平行計算與Neon簡介
- Python爬蟲:流程框架和常用模組Python爬蟲框架
- 大文字平行計算實現方式
- OpenCV使用ParallelLoopBody進行平行計算OpenCVParallelOOP
- 面試官:說說你對Fork/Join的平行計算框架的瞭解?面試框架
- python-----------------numpy計數模組Python
- 【1】Embarrassingly Parallel(易平行計算問題)Parallel
- 瞭解Flow -- elixir的平行計算庫
- python 模組:itsdangerous 模組Python
- Python模組:time模組Python
- 後端請求中的非同步計算與平行計算後端非同步
- 關於PHP精確計算模組PHP
- Python中爬蟲框架或模組的區別!Python爬蟲框架
- Python中爬蟲框架或模組的區別Python爬蟲框架
- Python模組之urllib模組Python
- python模組之collections模組Python
- 如何使用python計數模組counter?Python
- HPC高效能運算知識: 異構平行計算
- 平行宇宙模擬器
- Python 模組Python
- [Python模組學習] glob模組Python
- [轉載] python數學計算模組之math常用函式學習使用Python函式
- PostgreSQL11preview-平行計算增強彙總SQLView
- Python中模組是什麼?Python有哪些模組?Python
- Django框架之auth模組Django框架
- lms框架模組詳解框架
- Android模組化改造以及模組化通訊框架Android框架
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- Python Execl模組Python
- Python mongoHelper模組PythonGo
- Python——JSON 模組PythonJSON
- [Python] pipe模組Python
- Python - 模組包Python