python并行計算是concurrentfutures還是pp好用?
首先讓我們來了解一下這兩個模塊。
concurrent.futuresconcurrent.futures是一個為異步執行的可調用對象提供高層次接口的Python模塊。
開發者可以通過ThreadPoolExecutor使用線程來執行異步任務,也可以通過ProcessPoolExecutor使用進程來執行這些任務。
特點:
ThreadPoolExecutor和 ProcessPoolExecutor都繼承了Executor,所以擁有相同的接口,可以在必要時修改并轉換。
線程池和進程池的使用,可以大大提高程序的管理能力,節約程序開銷。示例代碼:
def sample():
with ThreadPoolExecutor(max_workers=4) as e:
e.submit(shutil.copy, 'data1.txt', 'data1_handled.txt')
e.submit(shutil.copy, 'data2.txt', 'data2_handled.txt')
e.submit(shutil.copy, 'data3.txt', 'data3_handled.txt')
e.submit(shutil.copy, 'data4.txt', 'data4_handled.txt')
def sample2():
executor = ThreadPoolExecutor(max_workers=4)
e.submit(shutil.copy, 'data1.txt', 'data1_handled.txt')
e.submit(shutil.copy, 'data2.txt', 'data2_handled.txt')
e.submit(shutil.copy, 'data3.txt', 'data3_handled.txt')
e.submit(shutil.copy, 'data4.txt', 'data4_handled.txt')
executor.shutdown()
PPPP是一個開源跨平臺的輕量級純Python模塊,它為運行在SMP(systems with multiple processors,多處理器系統)和集群上的Python并行代碼提供了運行機制。
具有以下特征:
動態分配進程處理器
支持多處理器和集群
動態平衡任務分配
示例代碼:
ppservers = ()
#ppservers = ("10.0.0.1",)
if len(sys.argv) > 1:
ncpus = int(sys.argv[1])
job_server = pp.Server(ncpus, ppservers=ppservers)
else:
job_server = pp.Server(ppservers=ppservers)
print "Starting pp with", job_server.get_ncpus(), "workers"
job1 = job_server.submit(sum_primes, (100,), (isprime,), ("math",))
result = job1()
選用模塊的選用并沒有固定的結果,只能說根據項目的具體需求并結合模塊的特點來比較得出某一個模塊更加適合的結果。
比如需要快速開發的時候,我個人傾向于concurrent.futures,我們目前開發的機器學習推薦系統項目就是使用的concurrent.futures。
而當項目需要集群才能有足夠計算力的時候,我傾向于使用PP,我們開發的一部分深度學習引擎項目就是使用的PP。
選用什么還是需要因地制宜。
最后小伙伴給我看看你們的大拇指,不甚感激,跪拜。。。