Se il lavoro che si desidera eseguire con gli elementi del generatore di permutazione richiede molta CPU, è probabile che si desideri utilizzare i processi anziché i thread. Il Global Interpreter Lock (GIL) di CPython rende multithreading di valore limitato durante il lavoro con CPU.
Invece, utilizzare la classe del modulo multiprocessing
Pool
, in questo modo:
import multiprocessing
import itertools
def do_stuff(perm):
# whatever
return list(reversed(perm))
if __name__ == "__main__":
with multiprocessing.Pool() as pool: # default is optimal number of processes
results = pool.map(do_stuff, itertools.permutations('1234', r=4))
# do stuff with results
Nota che se vi sarà l'iterazione results
(piuttosto che fare qualcosa con esso come una lista), è possibile utilizzare imap
invece di map
per ottenere un iteratore che è possibile utilizzare per lavorare sui risultati così come vengono prodotti dai processi di lavoro. Se non importa quale ordine vengono restituiti gli articoli, è possibile utilizzare imap_unordered
per (penso) salvare un po 'di memoria.
Il numero di targa if __name__ is "__main__"
è richiesto su Windows, dove il modulo multiprocessing
deve aggirare le limitazioni del sistema operativo (no fork
).
come si desidera dividere i dati tra i thread? perché vuoi usare thread multipli? –
Vorrei dividerlo in modo uniforme: se 'permanenti' contiene 1'000'000 voci e ho 4 thread ogni thread dovrebbe elaborare 250'000 voci; Se uso solo un thread ci vogliono circa 10 minuti per passare attraverso le intere voci quindi vorrei usare più di un thread – wasp256
che cosa è esattamente il tuo processo, vincolato all'IO o alla CPU? –