Python 3 Multiprocessing: Optimale Blockgröße

Wie finde ich die optimale Blockgröße fürmultiprocessing.Pool Instanzen?

Ich habe dies zuvor verwendet, um einen Generator für @ zu erstellen sudoku objects:

processes = multiprocessing.cpu_count()
worker_pool = multiprocessing.Pool(processes)
sudokus = worker_pool.imap_unordered(create_sudoku, range(n), n // processes + 1)

Um die Zeit zu messen, benutze ichtime.time() vor dem obigen Snippet, dann initialisiere ich den Pool wie beschrieben, dann konvertiere ich den Generator in eine Liste list(sudokus)) um die Erzeugung der Items auszulösen (nur zur Zeitmessung, ich weiß, das ist Unsinn im endgültigen Programm), dann nehme ich mir die Zeit mittime.time() erneut und gebe die Differenz aus.

Ich habe festgestellt, dass die Blockgröße vonn // processes + 1 Ergebnisse in Zeiten um 0.425 ms pro Objekt. Ich habe aber auch festgestellt, dass die CPU erst in der ersten Hälfte des Prozesses voll ausgelastet ist. Am Ende sinkt die Auslastung auf 25% (auf einem i3 mit 2 Kernen und Hyper-Threading).

Wenn ich ein kleineres Stück von @ benutint(l // (processes**2) + 1) stattdessen bekomme ich mal um 0.355 ms statt und die CPU-Last ist viel besser verteilt. Es hat nur ein paar kleine Stacheln bis ca. 75%, bleibt aber für einen viel längeren Teil der Prozesszeit hoch, bevor sie auf 25% sinkt.

Gibt es eine noch bessere Formel zur Berechnung der Blockgröße oder eine andere bessere Methode, um die CPU am effektivsten zu nutzen? Bitte helfen Sie mir, die Effektivität dieses Multiprozessorpools zu verbessern.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage