L’augmentation continue des volumes de données transforme profondément les pratiques en data science. Là où quelques millions de lignes constituaient auparavant un défi, il est désormais courant de manipuler des ensembles de données atteignant plusieurs milliards de lignes. Dans ce contexte, les outils historiques comme pandas montrent leurs limites, et une nouvelle génération de technologies émerge pour répondre à ces contraintes de performance, de mémoire et de scalabilité.
L’objectif de la démarche présentée est d’introduire des alternatives capables d’accélérer significativement les traitements tout en restant accessibles. L’idée directrice est simple : ne pas changer de langage — Python — mais changer de moteur d’exécution.
Traditionnellement, les data scientists effectuent leurs transformations à l’aide de pandas, une bibliothèque permettant de manipuler des tableaux de données appelés DataFrames. Un DataFrame est une structure tabulaire composée de colonnes typées, analogue à une table SQL.
Cependant, pandas repose principalement sur une exécution séquentielle (ligne par ligne ou bloc par bloc), et sur NumPy, une bibliothèque optimisée pour les calculs numériques mais limitée dans la gestion mémoire et le parallélisme.
Les nouveaux outils introduisent un changement fondamental : ils adoptent une approche déclarative. Cela signifie que l’on décrit ce que l’on veut calculer, et non comment le calculer. Le moteur se charge ensuite d’optimiser automatiquement l’exécution.
Un concept central est celui de lazy evaluation (évaluation paresseuse). Il s’agit d’un mode où les opérations ne sont pas exécutées immédiatement, mais enregistrées sous forme d’un plan de calcul. Ce plan est optimisé globalement avant exécution, ce qui permet d’éviter des lectures inutiles ou des calculs redondants.
Parmi les bibliothèques émergentes, Polars occupe une place centrale. Polars est une bibliothèque de manipulation de données écrite en Rust, un langage compilé réputé pour sa performance et sa sécurité mémoire. Elle implémente un moteur de calcul vectorisé, c’est-à-dire qu’elle applique des opérations sur des colonnes entières plutôt que sur des éléments individuels, ce qui améliore considérablement les performances.
Polars introduit également un typage fort, c’est-à-dire que chaque colonne possède un type strict (entier, float, chaîne de caractères, etc.). Cela permet au moteur d’optimiser les calculs et de réduire les conversions inutiles.
Un autre acteur clé est DuckDB. Il s’agit d’un moteur de base de données analytique qui fonctionne en mémoire ou directement sur disque. DuckDB repose sur le langage SQL, mais il est optimisé pour des analyses rapides sur de très gros volumes. Il est particulièrement efficace pour les agrégations, c’est-à-dire les opérations qui résument des données (moyenne, somme, minimum, etc.).
PyArrow joue un rôle transversal. Il fournit un format de mémoire standard basé sur des colonnes, appelé format Arrow. Ce format permet de partager des données entre différents outils sans copie, ce qui est appelé zero-copy. Cela signifie que les données ne sont pas dupliquées en mémoire lors des échanges entre bibliothèques, ce qui réduit fortement les coûts.
Enfin, des solutions comme PySpark permettent de distribuer les calculs sur plusieurs machines. On parle alors de calcul distribué, un modèle où les données et les calculs sont répartis sur un cluster. Cela devient indispensable lorsque les données dépassent largement la capacité d’une seule machine.
Les benchmarks présentés montrent un écart très important entre pandas et ces nouvelles solutions. Sur un cas réel impliquant un fichier de un milliard de lignes, les résultats sont sans appel. Là où pandas met plusieurs dizaines voire centaines de secondes, des outils comme DuckDB, Polars ou PyArrow peuvent réaliser le même traitement en moins de dix secondes.
La mémoire utilisée est également un facteur clé. Un DataFrame pandas peut occuper plusieurs dizaines de gigaoctets, tandis que Polars ou PyArrow réduisent significativement cette consommation. Cela est lié à leur gestion optimisée des types et à leur format colonne.
Un format colonne signifie que les données sont stockées colonne par colonne plutôt que ligne par ligne. Ce mode de stockage est particulièrement efficace pour les analyses, car il permet de lire uniquement les colonnes nécessaires.
Au-delà des outils, certaines pratiques sont essentielles pour optimiser les traitements.
La première est la vectorisation, qui consiste à appliquer une opération sur un ensemble de données en une seule fois. À l’inverse, une boucle for applique une opération élément par élément, ce qui est beaucoup plus lent.
Il est également recommandé de chaîner les opérations dans un pipeline. Un pipeline est une succession d’étapes de transformation appliquées aux données. Les moteurs modernes optimisent ces pipelines en fusionnant certaines opérations.
L’utilisation du format Arrow comme format intermédiaire est une autre bonne pratique. On parle de format “glue” car il sert de point de jonction entre différentes bibliothèques.
Enfin, le mode streaming permet de traiter des données qui ne tiennent pas en mémoire. Les données sont alors lues et traitées par morceaux. Cela est crucial pour les fichiers volumineux.
Le choix du format de stockage est souvent négligé, mais il a un impact majeur. Les formats colonne comme Parquet sont particulièrement adaptés aux analyses. Parquet est un format de fichier compressé et optimisé pour les lectures rapides.
La compression joue également un rôle. Des algorithmes comme Zstandard (zstd) ou LZ4 permettent de réduire la taille des fichiers, tandis que Snappy privilégie la vitesse de lecture.
Des formats plus avancés, comme Delta Lake ou Iceberg, ajoutent des fonctionnalités de gestion des versions et de transactions. Une transaction permet de garantir qu’une opération sur les données est réalisée entièrement ou pas du tout, ce qui est essentiel pour la fiabilité.
Le choix de l’outil dépend essentiellement du volume de données. Pour des petits volumes, pandas reste une solution simple et efficace. Lorsque les données atteignent plusieurs centaines de milliers de lignes jusqu’à plusieurs milliards, Polars, DuckDB ou PyArrow deviennent les meilleurs choix. Pour des volumes extrêmes, le recours à des solutions distribuées est nécessaire.
Cependant, il n’existe pas de solution universelle. La performance dépend du type de données, des transformations effectuées et de l’environnement d’exécution. Il est donc indispensable de réaliser des benchmarks sur ses propres cas d’usage.
L’écosystème data évolue vers des architectures plus performantes, plus modulaires et plus intelligentes. L’introduction de concepts comme l’évaluation paresseuse, les formats colonne ou le zero-copy transforme la manière dont les data scientists abordent les traitements.
Cette transition ne nécessite pas une rupture totale, mais plutôt une adaptation progressive. En remplaçant certains outils et en adoptant de nouvelles pratiques, il est possible d’obtenir des gains considérables en performance.
Plus qu’une évolution technologique, il s’agit d’un changement de manière de penser : passer d’une logique impérative à une logique optimisée, où le moteur de calcul devient un véritable partenaire dans l’analyse des données.