Pour rendre mon code plus "pythonique" et plus rapide, j'utilise le "multiprocessing" et une fonction map pour lui envoyer a) la fonction et b) la plage d'itérations.
La solution implantée (c'est-à-dire appeler tqdm directement sur la plage tqdm.tqdm (plage (0, 30)) ne fonctionne pas avec le multitraitement (comme formulé dans le code ci-dessous).
La barre de progression est affichée de 0 à 100% (quand python lit le code?) Mais elle n'indique pas la progression réelle de la fonction map.
Comment afficher une barre de progression qui indique à quelle étape se trouve la fonction «carte»?
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()
Toute aide ou suggestion est la bienvenue ...
.starmap()
: Voici un patch àPool
ajouter.istarmap()
, qui fonctionnera également avectqdm
.Réponses:
Utilisez imap au lieu de map, qui renvoie un itérateur de valeurs traitées.
la source
starmap()
?for i in tqdm.tqdm(...): pass
peut être plus simple, quelist(tqdm.tqdm)
chunk_size
dep.imap
. Peut-ontqdm
mettre à jour chaque itération au lieu de chaque morceau?Solution trouvée: soyez prudent! En raison du multitraitement, le temps d'estimation (itération par boucle, temps total, etc.) peut être instable, mais la barre de progression fonctionne parfaitement.
Remarque: le gestionnaire de contexte pour Pool n'est disponible qu'à partir de la version 3.3 de Python
la source
pbar.close()
pas nécessaire, il sera fermé automatiquement à la fin dewith
tqdm
appel intérieur est -il nécessaire ici?starmap()
?imap_unordered
est la clé ici, il donne les meilleures performances et les meilleures estimations de la barre de progression.Vous pouvez utiliser à la
p_tqdm
place.https://github.com/swansonk14/p_tqdm
la source
pip install
. Cela remplace tqdm pour la plupart de mes besoinsp_tqdm
est limité àmultiprocessing.Pool
, non disponible pour les discussionsDésolé d'être en retard, mais si tout ce dont vous avez besoin est une carte simultanée, la dernière version (
tqdm>=4.42.0
) a maintenant ce intégré:Références: https://tqdm.github.io/docs/contrib.concurrent/ et https://github.com/tqdm/tqdm/blob/master/examples/parallel_bars.py
la source
HBox(children=(FloatProgress(value=0.0, max=30.0), HTML(value='')))
Jupyterbasé sur la réponse de Xavi Martínez, j'ai écrit la fonction
imap_unordered_bar
. Il peut être utilisé de la même manière qu'àimap_unordered
la seule différence qu'une barre de traitement est affichée.la source
la source
Voici mon point de vue lorsque vous avez besoin de récupérer des résultats à partir de vos fonctions d'exécution parallèles. Cette fonction fait plusieurs choses (il y a un autre de mes articles qui l'explique plus loin) mais le point clé est qu'il y a une file d'attente de tâches en attente et une file d'attente de tâches terminées. Lorsque les travailleurs ont terminé avec chaque tâche de la file d'attente en attente, ils ajoutent les résultats dans la file d'attente des tâches terminées. Vous pouvez encapsuler la vérification dans la file d'attente des tâches terminées avec la barre de progression tqdm. Je ne mets pas l'implémentation de la fonction do_work () ici, ce n'est pas pertinent, car le message ici est de surveiller la file d'attente des tâches terminées et de mettre à jour la barre de progression chaque fois qu'un résultat est obtenu.
la source
Cette approche est simple et ça marche.
la source