Pythons inbyggda "för" -slingan är inte i sig parallelliserbar. För att köra en "för" -slinga parallellt måste du använda bibliotek som är utformade för parallellbehandling. De vanligaste metoderna är att använda "multiprocessing" -modulen eller specialiserade bibliotek som "samtidiga.Futures" och "joblib". Det bästa valet beror på arten av dina uppgifter.
Här är en uppdelning av hur man parallelliserar en "för" -slinga med dessa metoder, tillsammans med överväganden för optimal effektivitet:
1. `Multiprocessing`:
Denna modul ger den mest direkta kontrollen över parallella processer. Det är bäst lämpat när dina sling -iterationer är beräkningsintensiva och oberoende (inga delade minnesberoende).
`` `python
importera multiprocessing
DEF Process_Item (artikel):
"" "Funktionen som ska köras parallellt för varje objekt." ""
# Din kod för att behandla ett enda objekt går här. Exempel:
resultat =artikel * 2
avkastningsresultat
Om __Name__ =='__Main__':# Avgörande för Windows -kompatibilitet
data =lista (intervall (1000)) # dina data
med multiprocessing.pool (processer =multiprocessing.cpu_count ()) som pool:
resultat =pool.map (process_item, data) # applicera process_item på varje objekt i data
utskrift (resultat)
`` `
* `multiprocessing.pool`: Skapar en pool av arbetstagarprocesser. `multiprocessing.cpu_count ()` bestämmer det optimala antalet processer baserat på ditt systems CPU -kärnor. Justera detta nummer om det behövs (t.ex. för hypertrådning).
* `pool.map`: Tillämpar funktionen "Process_Item" på varje objekt i "Data" iterable och distribuerar arbetet över processerna.
* `om __Name__ =='__main __':`: Detta är viktigt, särskilt på Windows, för att förhindra rekursiv processskapande som kan leda till kraschar.
2. `Concurrent.Futures`:
Denna modul tillhandahåller ett högre gränssnitt på högre nivå än "multiprocessing" som erbjuder både processbaserad och trådbaserad parallellism. Trådar är i allmänhet lättare vikt men är begränsade av den globala tolklåset (GIL) i CPython, vilket gör dem mindre effektiva för CPU-bundna uppgifter.
`` `python
importera samtidiga.
DEF Process_Item (artikel):
# Samma som tidigare
resultat =artikel * 2
avkastningsresultat
om __name__ =='__main__':
Data =lista (intervall (1000))
med samtidiga.futures.processpoolexecutor () som exekutör:# Använd ProcessPoolExecutor för CPU-bundna uppgifter
resultat =lista (exekutor.map (process_item, data)))
utskrift (resultat)
`` `
* `ProcessPoolExecutor`: Använder processer, lämpliga för CPU-bundna operationer.
* `ThreadPoolExecutor`: Använder trådar, bättre för I/O-bundna operationer (väntar på nätverksförfrågningar, filläsningar etc.).
3. `Joblib`:
`Joblib 'är ett bibliotek som är specifikt designat för parallell datoranvändning i Python. Det används ofta i datavetenskap och maskininlärningssammanhang. Det erbjuder praktiska funktioner och hanterar vissa komplexiteter automatiskt.
`` `python
Från joblib importera parallell, försenad
DEF Process_Item (artikel):
# Samma som tidigare
resultat =artikel * 2
avkastningsresultat
om __name__ =='__main__':
Data =lista (intervall (1000))
resultat =parallell (n_jobs =-1) (försenad (process_item) (artikel) för objekt i data) # n_jobs =-1 använder alla processorer
utskrift (resultat)
`` `
* `parallell (n_jobs =-1)`: Kör uppgifterna parallellt med alla tillgängliga CPU-kärnor (`-1`).
* `försenad (process_item) (artikel)`: Försenar genomförandet av `Process_Item 'tills den är planerad med` parallell'.
Effektivitetsöverväganden:
* overhead: Parallellisering introducerar omkostnader. Om dina enskilda uppgifter är mycket snabba kan omkostnaderna uppväga fördelarna. Experiment för att hitta den optimala balansen.
* Dataöverföring: Att överföra data mellan processer kan vara långsamma. Minimera mängden som överförs om möjligt.
* Beroenden: Om dina loop -iterationer beror på varandra (t.ex. en iterations utgång är ingången till nästa) blir parallellisering mycket mer komplex och kanske inte är genomförbar.
* delade resurser: Undvik åtkomst till delade resurser (filer, databaser) från flera processer samtidigt utan korrekt synkroniseringsmekanismer (lås, semaforer), eftersom det kan leda till rasförhållanden och datakorruption.
* Antal processer: Det optimala antalet processer är vanligtvis nära antalet CPU -kärnor, men det kan variera beroende på uppgiften och systembelastningen. Experiment är nyckeln.
Kom ihåg att profilera din kod för att identifiera flaskhalsar och mäta prestandaförbättringen som uppnåtts genom parallellisering. Parallella med delar av din kod som bidrar avsevärt till den totala runtime. Olämplig parallellisering kan faktiskt * minska * prestanda.