Multiprocessamento Python 3: tamanho ideal de chunk

Como encontro o tamanho ideal de bloco paramultiprocessing.Pool instâncias?

Eu usei isso antes para criar um gerador den objetos sudoku:

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

Para medir o tempo, eu usotime.time() antes do snippet acima, inicializo o pool conforme descrito e converto o gerador em uma lista (list(sudokus)) para acionar a geração dos itens (apenas para medição do tempo, sei que isso não faz sentido no programa final), então dedico um tempo usandotime.time() novamente e faça a diferença.

Eu observei que o tamanho do pedaçon // processes + 1 resulta em tempos em torno de0,425 ms por objeto. Mas também observei que a CPU está totalmente carregada na primeira metade do processo; no final, o uso diminui para 25% (em um i3 com 2 núcleos e hyper-threading).

Se eu usar um tamanho menor de pedaçoint(l // (processes**2) + 1) em vez disso, recebo momentos em torno de0,355 ms em vez disso, e a carga da CPU é muito melhor distribuída. Ele só tem alguns picos pequenos até ca. 75%, mas permanece alto por uma parte muito mais longa do processo antes de cair para 25%.

Existe uma fórmula ainda melhor para calcular o tamanho do bloco ou um método melhor para usar a CPU mais eficaz? Ajude-me a melhorar a eficácia desse pool de multiprocessamento.

questionAnswers(2)

yourAnswerToTheQuestion