Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako je možné Parfor implementovať v Pythone na paralelné spracovanie?

Python nemá zabudovaný „parfor“ ako Matlab. Najbližšie ekvivalenty zahŕňajú použitie multiprocesívnych knižníc na dosiahnutie paralelného „pre„ správanie sa slučky. Najlepší prístup závisí od povahy vašej úlohy:

1. `multiprocessing.pool` pre úlohy viazané na CPU:

Je to vhodné, keď sú vaše iterácie slučky nezávislé a výpočtovo náročné (CPU). Je to efektívne na distribúciu práce vo viacerých jadrách CPU.

`` `Python

importovať multiprientovanie

def my_function (i):

"" "Funkcia, ktorá sa má vykonať paralelne." "

# Váš kód tu ...

result =i * 2 # príklad

výsledok návratnosti

Ak __name__ =='__main__':

s multiprocessing.pool (processes =multiprocessing.cpU_count ()) ako fondy:

Výsledky =Pool.map (my_function, rozsah (10)) # Rozsah (10) je váš rozsah slučky „pre“

Tlač (výsledky) # výstup:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

`` `

`multiprocessing.pool.map` aplikuje` my_function` na každý prvok v rozsahu `(10)` paralelne. `multiprocessing.cpu_count ()` určuje optimálny počet procesov. Upravte to na základe vášho systému a počtu dostupných jadier. Pamätajte si, že `if __name__ =='__main __':` blok je rozhodujúci pre správne multiprocessing v systéme Windows.

2. `concurrent.futures.processpooxecutor` (flexibilnejšie):

To ponúka väčšiu kontrolu a flexibilitu ako „multiprocessing.pool“, najmä ak potrebujete viac jemnozrnnej kontroly alebo spracovania chýb.

`` `Python

import súbežné.

def my_function (i):

# Váš kód tu ...

Výsledok =i * 2

návrat i, výsledok #Returning pôvodného indexu a výsledok je užitočný na sledovanie

Ak __name__ =='__main__':

s Concurrent.futures.ProcesspooLExecutor () ako exekútor:

výsledky =executor.map (my_function, rozsah (10))

Pre i, výsledok vo výsledkoch:

tlač (f "input:{i}, výstup:{result}")

`` `

`Executor.map` je podobný ako„ Pool.map`, ale umožňuje vyzdvihnutie a riešenie výnimiek. Môžete tiež použiť „executor.submit“ na viac asynchrónnej kontroly.

3. `joblib` pre jednoduchšiu syntax (často rýchlejšie):

`Joblib` zjednodušuje paralelné spracovanie, najmä pre numpy polia. Pre konkrétne číselné operácie často funguje lepšie ako „multiprocesívne“.

`` `Python

od joblibu import paralelne, oneskorené

def my_function (i):

# Váš kód tu ...

Výsledok =i * 2

výsledok návratnosti

Ak __name__ =='__main__':

Výsledky =paralelné (n_jobs =multiprocessing.cpu_count ()) (oneskorené (my_funkcia) (i) pre i v rozsahu (10))

Tlač (výsledky)

`` `

`joblib` automaticky spracováva distribúciu úloh a agregáciu výsledkov. `n_jobs 'určuje počet paralelných procesov.

Dôležité úvahy:

* Riadenie: Paralelné spracovanie zavádza režijné náklady z vytvárania procesu a komunikácie. Pre veľmi malé úlohy by režijné náklady mohli prevážiť nad výhodami.

* Zdieľanie údajov: Vyhnite sa zdieľaniu miešaných údajov priamo medzi procesmi; Namiesto toho odovzdajte kópie alebo v prípade potreby používajte komunikačné mechanizmy medzi procesmi (fronty, potrubia).

* závislosti: Uistite sa, že vaše funkcie a ich závislosti sú správne zabalené a dostupné pre každý proces pracovníka.

* I/O viazané úlohy: Ak vaša slučka zahŕňa významné I/O operácie (napr. Žiadosti o sieť, čítanie súborov), použitie „multiprocessing“ nemusí poskytnúť významné zrýchlenie. Zoberme si namiesto toho „Asyncio` alebo` Threading` (hoci `Threading` je obmedzený zámkom globálneho tlmočníka (GIL) v Cpython).

Vyberte prístup, ktorý najlepšie vyhovuje vašim potrebám a charakteristikám vašej úlohy. V jednoduchých prípadoch „Joblib` často poskytuje najjednoduchšie a najúčinnejšie riešenie. Pre zložitejšie scenáre s asynchrónnymi operáciami alebo jemnozrnnou kontrolou je „súbežná.futures“ silnejšie. Nezabudnite vždy profilovať svoj kód a určiť skutočné zisky z výkonu.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené