Optimisation du code multiprocesseur en Python

Meilleures pratiques pour un traitement parallèle efficace

Apprenez les techniques et les meilleures pratiques pour optimiser votre code multiprocesseur Python. Ce guide couvre la minimisation de la communication inter-processus, la gestion efficace des pools de processus et l’utilisation de la mémoire partagée pour un traitement efficace des données.

Programmation
Auteur·rice
Affiliation
Date de publication

5 février 2024

Modifié

29 avril 2025

Mots clés

Optimiser le multi-traitement, Optimisation du multiprocessing en Python, minimiser la surcharge IPC, Gestion du pool de processus, mémoire partagée Python

Introduction

Lors de l’utilisation du module Python multiprocessing, l’efficacité de l’exécution du code dépend souvent de la minimisation des frais généraux. L’optimisation de votre code multiprocesseur permet non seulement d’accélérer vos programmes, mais aussi de les rendre plus évolutifs et plus efficaces en termes de ressources. Dans ce tutoriel, nous aborderons les meilleures pratiques et techniques pour optimiser vos flux de travail multiprocessus en réduisant les frais généraux de communication interprocessus (IPC), en gérant efficacement les pools de processus et en tirant parti de la mémoire partagée lorsque c’est nécessaire.



Minimiser la surcharge de communication inter-processus

La communication inter-processus (IPC) peut être un goulot d’étranglement important pour les performances. Voici quelques stratégies pour réduire l’impact de la communication interprocessus:

  • Traitement par lots:
    Au lieu d’envoyer de nombreux petits messages entre les processus, regroupez les données par lots afin de minimiser le nombre de communications.

  • Éviter les transferts de données inutiles:
    Ne transmettre que les informations essentielles entre les processus. Utiliser la mémoire partagée pour les objets de données volumineux si possible.

  • Structures de données efficaces:
    Utilisez des structures de données légères qui sont plus rapides à sérialiser et à transmettre.

Exemple : Traitement par lots avec Pool.map

import multiprocessing
import time

def process_data(data_batch):
    # Simuler le traitement d'un lot de données
    time.sleep(1)
    return sum(data_batch)

if __name__ == "__main__":
    data = list(range(1, 101))
    # Regrouper les données en groupes de 10
    batches = [data[i:i+10] for i in range(0, len(data), 10)]
    
    with multiprocessing.Pool(processes=4) as pool:
        results = pool.map(process_data, batches)
    
    print("Processed Results:", results)

Gérer efficacement les pools de processus

L’utilisation correcte des pools de processus peut vous aider à atteindre un bon équilibre entre le parallélisme et l’utilisation des ressources.

  • Ajuster le nombre de processus:
    Faites des essais avec le nombre de processus de travail pour trouver l’équilibre optimal pour votre charge de travail spécifique.

  • Utiliser des gestionnaires de contexte:
    Utilisez le modèle with multiprocessing.Pool() as pool: pour vous assurer que les processus sont correctement fermés après leur exécution.

  • Mappage asynchrone:
    Pour les charges de travail plus dynamiques, envisagez d’utiliser apply_async ou imap pour gérer les tâches de manière asynchrone.

Exemple : Utilisation de apply_async avec un callback

import multiprocessing

def compute_square(n):
    return n * n

def collect_result(result):
    results.append(result)

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    results = []
    
    with multiprocessing.Pool(processes=3) as pool:
        for number in numbers:
            pool.apply_async(compute_square, args=(number,), callback=collect_result)
        pool.close()
        pool.join()
    
    print("Squares:", results)

Utilisation de la mémoire partagée

Dans les scénarios où plusieurs processus doivent accéder aux mêmes données sans les copier, les objets à mémoire partagée peuvent réduire considérablement les frais généraux.

  • Tableaux et valeurs partagés:
    Utilisez multiprocessing.Array et multiprocessing.Value pour partager des données entre processus sans les frais généraux de la sérialisation.

  • Vues de la mémoire:
    Utilisez les vues mémoire ou le module multiprocessing.shared_memory (disponible dans Python 3.8+) pour travailler avec des blocs de mémoire partagée.

Exemple : Utilisation d’un tableau partagé

import multiprocessing
import numpy as np

def increment_array(shared_array, size):
    # Convertir la mémoire partagée en tableau numpy
    arr = np.frombuffer(shared_array.get_obj())
    for i in range(size):
        arr[i] += 1

if __name__ == "__main__":
    size = 10
    # Créer un tableau partagé d'entiers
    shared_array = multiprocessing.Array('i', range(size))
    
    processes = []
    for _ in range(4):  # Créer 4 processus
        p = multiprocessing.Process(target=increment_array, args=(shared_array, size))
        processes.append(p)
        p.start()
    
    for p in processes:
        p.join()
    
    # Convertir la mémoire partagée en un tableau numpy pour afficher le résultat
    result_array = np.frombuffer(shared_array.get_obj())
    print("Resulting Array:", result_array)

Conclusion

L’optimisation du code multiprocessus en Python implique une combinaison de stratégies visant à réduire les frais généraux et à maximiser l’efficacité de l’exécution simultanée. En minimisant les communications interprocessus, en gérant efficacement vos pools de processus et en utilisant la mémoire partagée lorsque c’est nécessaire, vous pouvez améliorer de manière significative les performances de vos applications. Expérimentez ces techniques pour déterminer ce qui fonctionne le mieux pour vos cas d’utilisation spécifiques.

Plus d’informations

Bon codage, et que vos applications Python s’exécutent plus rapidement et plus efficacement!

Explorer d’autres articles

Note

Voici d’autres articles de la même catégorie pour vous aider à approfondir le sujet.

placeholder

placeholder
Aucun article correspondant
Retour au sommet

Réutilisation

Citation

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Optimisation du code multiprocesseur en Python},
  date = {2024-02-05},
  url = {https://www.datanovia.com/fr/learn/programming/python/advanced/parallel-processing/optimizing-multiprocessing-code.html},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2024. “Optimisation du code multiprocesseur en Python.” February 5, 2024. https://www.datanovia.com/fr/learn/programming/python/advanced/parallel-processing/optimizing-multiprocessing-code.html.