Wenn die Arbeit, die Sie mit den Elementen aus dem Permutationsgenerator ausführen möchten, CPU-intensiv ist, möchten Sie wahrscheinlich Prozesse statt Threads verwenden. CPythons Global Interpreter Lock (GIL) macht Multithreading von begrenztem Wert, wenn CPU-gebundene Arbeit ausgeführt wird.
Verwenden Sie stattdessen die Pool
Klasse multiprocessing
Modul, etwa so:
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
Beachten Sie, dass, wenn Sie über results
iteriert wird (anstatt mit ihm als Liste, etwas zu tun), können Sie imap
anstelle von map
, um einen Iterator zu erhalten, mit dem Sie die Ergebnisse bearbeiten können, da sie von den Arbeitsprozessen erzeugt werden. Wenn es egal ist, in welcher Reihenfolge die Elemente zurückgegeben werden, können Sie imap_unordered
verwenden, um (ich denke) ein wenig Speicher zu sparen.
Die Voreinstellung if __name__ is "__main__"
ist für Windows erforderlich, wobei das Modul multiprocessing
die Einschränkungen des Betriebssystems umgehen muss (keine fork
).
Wie möchten Sie die Daten zwischen Threads teilen? Warum willst du mehrere Threads verwenden? –
Ich möchte es gleichmäßig aufteilen: wenn 'perms' 1'000'000 Einträge enthält und ich 4 Threads habe, sollte jeder Thread 250'000 Einträge verarbeiten; Wenn ich nur einen Thread verwende, dauert es etwa 10 Minuten, um die gesamten Einträge zu durchlaufen. Deshalb würde ich gerne mehr als einen Thread verwenden. – wasp256
was genau ist Ihr Prozess, IO gebunden oder CPU gebunden? –