在 C 語言中,OpenMP 為平行程式設計提供了強大的支援。然而Python缺少這個方便的工具。我們如何在Python程式中實現並行性,特別是在獨立函數需要並行化的場景中?
考慮以下程式碼結構:
<code class="python">solve1(A) solve2(B)</code>
其中solve1和solve2是獨立函數。目的是並行執行此程式碼,最大限度地減少執行時間。
讓我們來探索一下提供的程式碼片段:
<code class="python">def solve(Q, G, n): i = 0 tol = 10 ** -4 while i < 1000: inneropt, partition, x = setinner(Q, G, n) outeropt = setouter(Q, G, n) if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol: break node1 = partition[0] node2 = partition[1] G = updateGraph(G, node1, node2) if i == 999: print "Maximum iteration reaches" print inneropt</code>
我們的目標是並行化 setinner 和 setouter 函數。
多處理模組為 Python 中的平行程式設計提供了強大的解決方案。它允許我們產生多個可以同時執行任務的進程,並利用多個 CPU 核心的處理能力。
對於提供的程式碼,可以使用處理池。其實作方式如下:
<code class="python">from multiprocessing import Pool pool = Pool() result1 = pool.apply_async(solve1, [A]) # evaluate "solve1(A)" asynchronously result2 = pool.apply_async(solve2, [B]) # evaluate "solve2(B)" asynchronously answer1 = result1.get(timeout=10) answer2 = result2.get(timeout=10)</code>
此程式碼片段建立一個進程池,該進程池將非同步執行solve1 和solve2 函數。每個CPU核心可以同時執行一個進程,有效減少執行時間。
另一種方法並行化任務的方法是使用map函數:
<code class="python">args = [A, B] results = pool.map(solve1, args)</code>
這種方法將solve1函數應用於args 列表中的每個元素都是並行的。
但是,需要注意的是,執行緒不應該用於 Python 中的平行程式設計。這是因為 GIL(全域解釋器鎖定)阻止多個執行緒同時執行 Python 字節碼,從本質上否定了並行性的任何潛在好處。
以上是如何在 Python 中實現並行性:釋放多核心能力?的詳細內容。更多資訊請關注PHP中文網其他相關文章!