Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Tu je rozdelenie toho, ako paralelizovať „slučku s týmito metódami, spolu s úvahami pre optimálnu účinnosť:
1. „Multiprocessing“:
Tento modul poskytuje najpriamejšiu kontrolu nad paralelnými procesmi. Najlepšie sa hodí, keď sú vaše iterácie slučky výpočtovo intenzívne a nezávislé (žiadne závislosti na zdieľanej pamäti).
`` `Python
importovať multiprientovanie
def process_item (položka):
"" "Funkcia, ktorá sa má vykonať paralelne pre každú položku." "
# Váš kód na spracovanie jednej položky ide sem. Príklad:
Výsledok =položka * 2
výsledok návratnosti
Ak __name__ =='__main__':# pre kompatibilitu systému Windows
dáta =zoznam (rozsah (1000)) # Vaše údaje
s multiprocessing.pool (processes =multiprocessing.cpU_count ()) ako fondy:
Výsledky =Pool.map (Process_item, Data) # Aplikácia Process_item na každú položku v údajoch
Tlač (výsledky)
`` `
* `multiprocessing.pool`: Vytvára skupinu pracovných procesov. `multiprocessing.cpu_count ()` určuje optimálny počet procesov založených na jadrách procesora vášho systému. V prípade potreby upravte toto číslo (napr. Na hypertheading).
* `Pool.map`: Aplikuje funkciu „Process_item` na každú položku v„ dátovej “itrable a distribuuje prácu v procesoch.
* `if __name__ =='__main __':`: Je to nevyhnutné, najmä v systéme Windows, aby sa zabránilo tvorbe rekurzívnych procesov, ktoré môžu viesť k nehodám.
2. `concurrent.futures`:
Tento modul poskytuje rozhranie na vyššej úrovni ako „multiprocessing“, ktoré ponúka paralelizmus založený na procesoch aj vlákna. Vlákna sú vo všeobecnosti ľahšie, ale sú obmedzené zámkom globálneho tlmočníka (GIL) v Cpython, čo ich robí menej účinnými pre úlohy viazané na CPU.
`` `Python
import súbežné.
def process_item (položka):
# Rovnaké ako predtým
Výsledok =položka * 2
výsledok návratnosti
Ak __name__ =='__main__':
dáta =zoznam (rozsah (1000))
s concurrent.futures.processpooLExecutor () ako exekútor:# Používajte processpooxecutor pre úlohy viazané na procesory
výsledky =zoznam (executor.map (proces_item, data))
Tlač (výsledky)
`` `
* `ProcesspooLExecutor`: Používa procesy vhodné pre operácie viazaných na procesory.
* `ThreadpooLExecutor`: Používa vlákna, lepšie pre operácie viazaných na I/O (čakanie na sieťové požiadavky, čítanie súborov atď.).
3. `joblib`:
`joblib` je knižnica špeciálne navrhnutá na paralelné výpočty v Pythone. Často sa používa v kontextoch vedy o údajoch a strojovom učení. Ponúka pohodlné funkcie a automaticky spracováva niektoré zložitosti.
`` `Python
od joblibu import paralelne, oneskorené
def process_item (položka):
# Rovnaké ako predtým
Výsledok =položka * 2
výsledok návratnosti
Ak __name__ =='__main__':
dáta =zoznam (rozsah (1000))
Výsledky =paralelné (n_jobs =-1) (oneskorené (process_item) (položka) pre položku v údajoch) # n_jobs =-1 Používa všetky procesory
Tlač (výsledky)
`` `
* `paralelné (n_jobs =-1)`: Spustí úlohy paralelne pomocou všetkých dostupných jadier CPU (`-1`).
* `oneskorené (proces_item) (položka)`: Oneskorenie vykonávania `Process_item`, kým nebude naplánované podľa` paralelne`.
Úvahy o účinnosti:
* Riadenie: Paralelizácia zavádza režijné náklady. Ak sú vaše individuálne úlohy veľmi rýchle, režijné náklady môžu prevážiť výhody. Experimentujte na nájdenie optimálnej rovnováhy.
* prenos údajov: Odovzdávanie údajov medzi procesmi môže byť pomalé. Minimalizujte množstvo prenesených údajov, ak je to možné.
* závislosti: Ak sa vaše iterácie slučky navzájom závisia (napr. Výstupom jedného iterácie je vstup pre ďalší), paralelizácia sa stáva oveľa zložitejšou a nemusí byť uskutočniteľná.
* Zdieľané zdroje: Vyhnite sa prístupu k zdieľaným zdrojom (súbory, databáz) z viacerých procesov súčasne bez správnych synchronizačných mechanizmov (zámky, semafory), pretože to môže viesť k rasovým podmienkam a poškodeniu údajov.
* Počet procesov: Optimálny počet procesov je zvyčajne blízko počtu jadier CPU, ale môže sa líšiť v závislosti od úlohy a zaťaženia systému. Experimentovanie je kľúčové.
Nezabudnite profilovať svoj kód a identifikovať prekážky a zmerať zlepšenie výkonu dosiahnuté paralelizáciou. Súbežne paralelizujte časti vášho kódu, ktoré výrazne prispievajú k celkovému behu. Nevhodná paralelizácia môže skutočne * znížiť * výkon.