6. Performances
On peut s’intéresser au temps de résolution pour ces paquetages tests. Les valeurs approchées peuvent évidemment varier avec la plateforme, l’architecture … Mais ce qui est intéressant c’est de regarder les valeurs relatives, d’une fonction à l’autre. Nous constatons que pour un paquetage individuel les méthodes importlib et pip sont rapides, mamba est plus lente, conda est carrément couteuse, ce qui nous donne des lignes directrices quand à leur utilisation.
| Fonction/méthode | PIL | pillow | Pillow | numpy | toto |
pypkgs_importlib (+files +meta) |
0 s | 0 s | 0 s | 0 s | 0 s |
pypkgs_pkg_pip |
0.9 – 1.8 s | 1.2 s | 1.2 s | 1.3 s | 1 s |
pypkgs_pkg_conda_json (mamba) |
4 – 7 s | 4 – 5 s | 4 – 5 s | 4 – 5 s | 4 – 5 s |
pypkgs_pkg_conda_json (conda) |
18 – 22 s | 18 s | 18 – 19 s | 18 – 19 s | 18 – 19 s |
Au passage nous constatons que tester un paquetage qui n’existe pas prends autant de temps que tester un paquetage existant. L’écart entre mamba et conda est connu, mamba a été conçu pour être plus rapide en tant que solver, en étant programmé différemment. Ceci dit pour les installations purement basées sur conda, on peut utiliser libmamba-solver (commande du type conda install -n base conda-libmamba-solver) et forcer la résolution avec --solver=libmamba ou utiliser conda config --set solver libmamba.
Ensuite il n’y a pas que la rapidité mais la capacité à résoudre les dépendances, pip a été amélioré, le solveur est rapide mais s’il n’est pas dans un contexte contraint pip/pypi (par exemple un environnement mixte incluant des paquetages installés à partir des canaux conda/mamba) il manque quelque chose.
7. Référentiel
Fonctions du module pypkgs.py interrogeant un paquetage donné (ne produisant pas une liste de paquetages), en mode abrégé (septembre 2025).
| Fonction | Utilisation |
pypkgs_init_pdict |
Prends comme argument pname (le nom du module à tester) et renvoie le dictionnaire pdict initialisé avec des valeurs par défaut (ex: pdict['score']=0). |
pypkgs_scoring |
Prends comme argument le dictionnaire pdict et une chaine de caractères what ('importlib', 'meta', 'files', 'pip', 'mamba', 'conda') identifiant le bit à mettre à jour. Calcule un entier (0 à 255) correspondant à la valeur décimale du tableau de bits et mets à jour pdict['score'] puis renvoie le dictionnaire. |
pypkgs_scoring_explain |
A partir de pdict, reprends le score, le convertit en tableau de bits et affiche la valeur commentée de chaque bit. |
pypkgs_importlib |
Invoque importlib avec les arguments (pname, pdict={}, files=True, meta=True, verb=0). Par défaut invoque importlib.util, si meta actif invoque importlib.metadata, si files actif invoque importlib.resources. Renvoie le dictionnaire pdict mis à jour. |
pypkgs_pkg_pip |
Invoque pip en mode externe avec les arguments (pname, pdict={}, verb=0). Renvoie le dictionnaire pdict mis à jour. |
pypkgs_pkg_conda_cmd |
Fonction interne, utilisé par pypkgs_pkg_conda_simple et par pypkgs_pkg_conda_json, prends en charge l’appel à conda ou mamba (mode simple ou json). |
pypkgs_pkg_conda_simple |
Avec les arguments (pname, pdict={}, exec='mamba', verb=0) invoque mamba ou conda en fonction de l’argument exec. Renvoie le dictionnaire pdict mis à jour. |
pypkgs_pkg_conda_json |
Identique à pypkgs_pkg_conda_simple mais invoque mamba ou conda en mode Json. Dans ce cas, stdout correspond à un flot Json qui est décodé par la fonction. Renvoie le dictionnaire pdict mis à jour. |
pypkgs_pkg_multiple |
Cette fonction combine les méthodes importlib (level=0), importlib+meta+files (level=1), pip (level=2), mamba-json (level=3) et l’initialisation du dictionnaire pdict. Elle prends en arguments pdict, level et verb. Elle renvoie 3 valeurs (score, expected, pdict), la variable expected est en cours de développement. |
8. Conclusion
Au final, c’est un peu râlant de voir qu’il n’y a pas un système de gestion de paquetage intégré, qui nous donne des informations complètes, même dans le contexte d’une installation maitrisée. Cela viendra peut être avec le temps, mais ne prendra pas en compte les outils métiers externes que l’on est obligés d’intégrer à Python. Par exemple pour Openbabel (chimie) il nous faut intégrer à la fois les modules Python openbabel/pybel, les binaires obabel, les paramétrages qui ne sont pas intégrés avec les modules, et des variables d’environnement.
Concernant le module pypkgs, nous constatons donc que nous arrivons à résoudre jusqu’au channel/build en discriminant ce qui peut s’apparenter à des faux positifs (ex: PIL et Pillow). Le point négatif est la lenteur cumulée de cette résolution dans le cas d’un nombre élevé de paquetages individuels, mais que nous pourrons contourner avec une approche basée sur la production de listes (et qui sera développée dans une autre note). En effet, la commande mamba list (sans le nom de paquetage) produit une liste de paquetages avec des informations telles que le nom, build, canal. Nous pouvons générer une fois pour toutes cette liste, la sauver, l’utiliser pour plusieurs paquetages si le nombre de résolutions à faire est trop élevé.
Liens et lectures
- subprocess — Subprocess management [ https://docs.python.org/3.12/library/subprocess.html ].
- A Faster Solver for Conda: Libmamba [ https://www.anaconda.com/blog/a-faster-conda-for-a-growing-community ].
- Welcome to Mamba’s documentation! [ https://mamba.readthedocs.io/en/latest/ ].