Para tornar meu código mais "pythônico" e mais rápido, eu uso "multiprocessamento" e uma função de mapa para enviar a) a função eb) o intervalo de iterações.
A solução implantada (ou seja, chame tqdm diretamente no intervalo tqdm.tqdm (intervalo (0, 30)) não funciona com multiprocessamento (conforme formulado no código abaixo).
A barra de progresso é exibida de 0 a 100% (quando o python lê o código?), Mas não indica o progresso real da função do mapa.
Como exibir uma barra de progresso que indica em qual etapa está a função 'mapa'?
from multiprocessing import Pool
import tqdm
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
p = Pool(2)
r = p.map(_foo, tqdm.tqdm(range(0, 30)))
p.close()
p.join()
Qualquer ajuda ou sugestão é bem vinda ...
.starmap()
: Aqui está um patch paraPool
adicionar.istarmap()
, que também funcionarátqdm
.Respostas:
Use imap em vez de map, que retorna um iterador de valores processados.
fonte
starmap()
?for i in tqdm.tqdm(...): pass
pode ser mais direto, quelist(tqdm.tqdm)
chunk_size
dep.imap
. Podetqdm
atualizar cada iteração em vez de cada pedaço?Solução encontrada: tenha cuidado! Devido ao multiprocessamento, o tempo de estimativa (iteração por loop, tempo total, etc.) pode ser instável, mas a barra de progresso funciona perfeitamente.
Observação: o gerenciador de contexto para Pool está disponível apenas a partir do Python versão 3.3
fonte
pbar.close()
não é necessário, será fechado automaticamente no encerramento dewith
tqdm
chamada / chamada interna é necessária aqui?starmap()
?imap_unordered
é a chave aqui, dá melhor desempenho e melhores estimativas de barra de progresso.Você pode usar em seu
p_tqdm
lugar.https://github.com/swansonk14/p_tqdm
fonte
pip install
. Isso está substituindo tqdm para a maioria das minhas necessidadesp_tqdm
está limitado amultiprocessing.Pool
, não disponível para tópicosDesculpe pelo atraso, mas se você só precisa de um mapa simultâneo, a versão mais recente (
tqdm>=4.42.0
) agora tem este integrado:Referências: https://tqdm.github.io/docs/contrib.concurrent/ e https://github.com/tqdm/tqdm/blob/master/examples/parallel_bars.py
fonte
HBox(children=(FloatProgress(value=0.0, max=30.0), HTML(value='')))
Jupytercom base na resposta de Xavi Martínez escrevi a função
imap_unordered_bar
. Pode ser usado da mesma forma,imap_unordered
com a única diferença de que uma barra de processamento é exibida.fonte
fonte
Aqui está minha opinião sobre quando você precisa obter resultados de suas funções de execução paralela. Essa função faz algumas coisas (há outro post meu que explica isso melhor), mas o ponto principal é que há uma fila de tarefas pendentes e uma fila de tarefas concluídas. Conforme os trabalhadores concluem cada tarefa na fila pendente, eles adicionam os resultados na fila de tarefas concluídas. Você pode agrupar a verificação na fila de tarefas concluídas com a barra de progresso tqdm. Não estou colocando a implementação da função do_work () aqui, não é relevante, já que a mensagem aqui é monitorar a fila de tarefas concluídas e atualizar a barra de progresso sempre que um resultado for obtido.
fonte
Essa abordagem é simples e funciona.
fonte