ホームページ >バックエンド開発 >Python チュートリアル >Python で並列処理を実装する方法: マルチコアのパワーを解き放つ?
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 コアは 1 つのプロセスを同時に実行できるため、実行時間を効果的に短縮できます。
タスクを並列化する別の方法は、map 関数を使用することです。
<code class="python">args = [A, B] results = pool.map(solve1, args)</code>
このアプローチでは、solve1 関数をargs リストの各要素を並列に実行します。
ただし、Python での並列プログラミングにはスレッドを使用すべきではないことに注意することが重要です。これは、GIL (グローバル インタプリタ ロック) により、複数のスレッドが Python バイトコードを同時に実行できなくなり、並列処理の潜在的な利点が実質的に無効になるためです。
以上がPython で並列処理を実装する方法: マルチコアのパワーを解き放つ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。