Python 中的並行 for 迴圈

Shivam Arora 2023年1月30日
  1. 在 Python 中使用 multiprocessing 模組並行化 for 迴圈
  2. 在 Python 中使用 joblib 模組並行化 for 迴圈
  3. 在 Python 中使用 asyncio 模組並行化 for 迴圈
Python 中的並行 for 迴圈

並行化迴圈意味著使用多個核心並行擴充套件所有程序。當我們有大量作業時,每個計算都不會等待並行處理中的前一個計算完成。相反,它使用不同的處理器來完成。

在本文中,我們將在 Python 中並行化 for 迴圈。

在 Python 中使用 multiprocessing 模組並行化 for 迴圈

為了並行化迴圈,我們可以使用 Python 中的 multiprocessing 包,因為它支援根據另一個正在進行的程序的請求建立子程序。

可以使用 multiprocessing 模組代替 for 迴圈來對可迭代物件的每個元素執行操作。可以使用 multiprocessing.pool() 物件,因為在 Python 中使用多執行緒不會因為全域性直譯器鎖而給出更好的結果。

例如,

import multiprocessing


def sumall(value):
    return sum(range(1, value + 1))


pool_obj = multiprocessing.Pool()

answer = pool_obj.map(sumall, range(0, 5))
print(answer)

輸出:

0, 1, 3, 6, 10

在 Python 中使用 joblib 模組並行化 for 迴圈

joblib 模組使用多處理來執行多個 CPU 核心來執行 for 迴圈的並行化。它提供了一個輕量級的管道,可以記住模式以進行簡單直接的平行計算。

要執行並行處理,我們必須設定作業數,而作業數受限於 CPU 中的核心數或當前可用或空閒的核心數。

delayed() 函式允許我們告訴 Python 在一段時間後呼叫特定的提到的方法。

Parallel() 函式建立一個具有指定核心的並行例項(在本例中為 2)。

我們需要為程式碼的執行建立一個列表。然後將列表傳遞給並行,並行開發兩個執行緒並將任務列表分發給它們。

請參考下面的程式碼。

from joblib import Parallel, delayed
import math


def sqrt_func(i, j):
    time.sleep(1)
    return math.sqrt(i ** j)


Parallel(n_jobs=2)(delayed(sqrt_func)(i, j) for i in range(5) for j in range(2))

輸出:

[1.0,
 0.0,
 1.0,
 1.0,
 1.0,
 1.4142135623730951,
 1.0,
 1.7320508075688772,
 1.0,
 2.0]

在 Python 中使用 asyncio 模組並行化 for 迴圈

asyncio 模組是單執行緒的,通過使用 yield fromawait 方法暫時掛起協程來執行事件迴圈。

下面的程式碼會在被呼叫時並行執行,而不會影響要等待的主函式。該迴圈還與主函式並行執行。

import asyncio
import time


def background(f):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)

    return wrapped


@background
def your_function(argument):
    time.sleep(2)
    print("function finished for " + str(argument))


for i in range(10):
    your_function(i)


print("loop finished")

輸出:

ended execution for 4
ended execution for 8
ended execution for 0
ended execution for 3
ended execution for 6
ended execution for 2
ended execution for 5
ended execution for 7
ended execution for 9
ended execution for 1

相關文章 - Python Loop