FireDucks peut accélérer certains workloads pandas très nettement, surtout sur tri, filtrage, groupby et jointures. Je vais vous montrer ce que cette librairie change vraiment, comment l’utiliser avec du code Python simple, et comment lire les benchmarks sans tomber dans le fantasme du “20x partout”.
Pourquoi pandas ralentit-il ?
Pandas ralentit surtout quand les données grossissent et que chaque opération commence à coûter cher en mémoire et en CPU. J’aime beaucoup pandas. Pour explorer un fichier, nettoyer quelques colonnes, faire des stats rapides, c’est simple, lisible, efficace. Le problème arrive quand on passe de quelques centaines de milliers de lignes à plusieurs millions, parfois dizaines de millions. Là, les mêmes lignes de code peuvent devenir beaucoup moins agréables.
Ce n’est pas que pandas est mauvais. C’est plutôt que son modèle d’exécution n’est pas toujours pensé pour éviter les calculs intermédiaires inutiles. Quand vous enchaînez plusieurs transformations, pandas exécute souvent chaque étape l’une après l’autre, en créant parfois des copies temporaires. Sur un petit dataset, on ne le voit pas. Sur un gros dataset, ça finit par peser.
Les opérations qui ralentissent le plus sont souvent les mêmes :
Comme on dit à Brive, un bon plan de marquage vaut mieux qu’un bon reporting ! Si besoin, consultez moi - faites appel à un super consultant en tracking client et server side.
- Le tri, surtout sur plusieurs colonnes, parce qu’il faut réorganiser beaucoup de lignes en mémoire.
- Le filtrage multi-colonnes, quand plusieurs conditions doivent être évaluées sur tout le DataFrame.
- Les groupby, parce qu’il faut regrouper, agréger, parfois recalculer beaucoup de choses.
- Les jointures, surtout quand les clés ne sont pas propres ou que les tables sont volumineuses.
- Les pipelines chaînés, très élégants à lire, mais qui peuvent multiplier les objets intermédiaires.
Un exemple typique, c’est ce genre de code. Il est propre, il se lit bien, mais sur plusieurs millions de lignes, chaque étape peut ajouter du temps et de la mémoire consommée.
result = (
df[df["status"] == "paid"]
.sort_values(["country", "created_at"])
.groupby(["country", "product_id"])
.agg({"amount": "sum", "user_id": "nunique"})
.reset_index()
)
Chez un client, le sujet n’était pas de réécrire toute la stack data, juste de gagner du temps sur les traitements qui tournent tous les jours. Le job pandas passait, mais il passait lentement. Et quand un traitement quotidien prend 45 minutes au lieu de 8, ça finit par bloquer des équipes.
C’est là que FireDucks devient intéressant. L’idée n’est pas de jeter pandas à la poubelle. L’intérêt, c’est de garder une API très proche de pandas, donc de tester vite, sans migrer tout le code vers Spark, Polars ou un autre framework. Vous remplacez peu de choses, vous mesurez, puis vous voyez si le gain est réel sur vos données.
La vraie question maintenant, c’est comment FireDucks arrive à accélérer ces traitements sans vous demander de tout réécrire.
Comment FireDucks fonctionne-t-il ?
FireDucks fonctionne en gardant une compatibilité élevée avec l’API pandas, mais avec un moteur interne différent. C’est ça le point clé. Vous écrivez du code qui ressemble beaucoup à pandas, parfois avec très peu de changements, mais derrière FireDucks ne traite pas forcément chaque ligne au moment exact où vous l’écrivez.
Avec pandas classique, l’exécution est plutôt immédiate. Vous filtrez, pandas crée un résultat. Vous groupez, pandas retravaille ce résultat. Vous triez, pandas retravaille encore. Avec FireDucks, on se rapproche d’une logique d’exécution paresseuse, ou lazy execution. Ça veut dire que les opérations sont collectées, puis FireDucks construit un plan d’exécution avant de lancer réellement les calculs.
result = (
df[df["country"] == "FR"] # On filtre
.groupby("category")["amount"] # On groupe
.sum() # On agrège
.sort_values(ascending=False) # On trie
)
Dans cet exemple, FireDucks peut regarder le pipeline complet avant d’exécuter. Il voit qu’on filtre d’abord sur la France, puis qu’on ne garde que certaines colonnes utiles pour le groupby et l’agrégation. Il peut donc éviter une partie des calculs intermédiaires, limiter les copies inutiles, et organiser le travail plus intelligemment. Sur de petits fichiers, vous ne verrez pas toujours une énorme différence. Sur de gros datasets, là ça commence à devenir intéressant.
Les gains sont surtout visibles sur certains traitements que je vois souvent chez mes clients :
- Filtrage : Moins de lignes à manipuler très tôt dans le pipeline.
- Groupby : Agrégations plus efficaces quand le moteur optimise le plan global.
- Jointures : Meilleure organisation des données avant de faire le merge.
- Tri : Exécution plus intelligente, surtout quand le tri arrive après une réduction du volume.
FireDucks exécute ensuite ce plan en multithread sur CPU. Multithread veut simplement dire qu’il utilise plusieurs cœurs du processeur en parallèle, au lieu de faire tout le travail sur un seul fil d’exécution. C’est souvent là que pandas montre ses limites.
| API proche de pandas | Le code reste familier, avec une syntaxe très proche de pandas. |
| Exécution paresseuse | Les opérations sont collectées avant d’être réellement calculées. |
| Optimisation du plan | FireDucks peut réduire les calculs intermédiaires inutiles. |
| Multithread CPU | Le moteur exploite plusieurs cœurs processeur pour accélérer les traitements. |
| Compatibilité à vérifier | Certaines fonctions pandas ou bibliothèques tierces peuvent ne pas réagir pareil. |
Je garde quand même une nuance importante. FireDucks n’est pas un remplacement parfait de pandas. L’API est proche, mais les objets internes ne sont pas identiques. Certaines bibliothèques tierces qui attendent un vrai DataFrame pandas peuvent poser problème. Le bon réflexe, c’est simple : vous testez sur vos vrais workloads, vous comparez les sorties, et vous validez les cas limites avant de basculer en production.
Comment installer FireDucks ?
FireDucks s’installe avec pip, comme une librairie Python classique. Dans beaucoup de cas, mon premier test est très simple : je prends un script pandas existant, et je remplace import pandas as pd par import fireducks.pandas as pd. C’est presque bête, mais c’est justement l’intérêt. Quand le code pandas est assez standard, le coût de test est faible.
pip install -U fireducks
Ensuite, l’import principal ressemble à ça. FireDucks expose une API compatible pandas, donc on garde souvent les mêmes réflexes : lecture de fichier, filtre, groupby, agrégations, tri. Ici je prends un exemple classique de dataset de commandes, avec des colonnes comme customer_id, country, revenue, category et order_date. Bien sûr, ce n’est qu’un exemple de structure, vos colonnes dépendront de vos données.
import fireducks.pandas as pd
# Même réflexe que pandas, mais moteur FireDucks derrière l’API
df = pd.read_parquet('orders.parquet')
# Filtrage sur plusieurs colonnes
filtered = df[(df['country'] == 'FR') & (df['revenue'] > 100)]
# Agrégation business classique
result = (
filtered
.groupby('category')
.agg({'revenue': 'sum', 'customer_id': 'nunique'})
.sort_values('revenue', ascending=False)
)
# Le résultat est matérialisé au moment où on en a besoin
print(result.head())
Ce genre de test est utile sur des scripts d’analyse, des jobs batch, ou des notebooks qui manipulent déjà des fichiers Parquet. Parquet, pour faire simple, c’est un format colonne très utilisé en data parce qu’il lit vite et compresse bien. Sur de gros volumes, ça peut faire une vraie différence.
Je garde quand même une règle simple : je ne promets jamais un gain avant d’avoir mesuré. FireDucks peut accélérer certains traitements pandas, mais pas tous. Si votre script passe son temps dans des fonctions très spécifiques, dans du Python pur, ou dans des appels externes, le gain peut être faible. Mais quand le code est propre, vectorisé, avec des filtres, des groupby et des tris, ça vaut clairement le test.
Comment benchmarker proprement ?
Pour benchmarker FireDucks proprement, je mesure deux choses : le temps réel d’exécution et l’équivalence des résultats avec pandas. Si je ne vérifie que le chrono, je peux me raconter une belle histoire. Si je ne force pas l’exécution côté FireDucks, je risque surtout de mesurer un plan optimisé, pas le vrai calcul.
Dans ce benchmark, j’ai utilisé un dataset principal de 10 millions de lignes et une table de lookup de 2 millions de lignes. J’ai fait un run d’échauffement, puis cinq runs mesurés. J’ai alterné l’ordre entre pandas et FireDucks pour éviter qu’un moteur profite toujours du cache en premier. Je rapporte la médiane, pas le meilleur temps, parce que le meilleur temps est souvent un accident heureux.
Le contexte matériel et logiciel compte beaucoup ici. Les mesures viennent d’un environnement avec CPU 9 cores AMD EPYC 9V74, environ 15.93 GiB de RAM, Python 3.12.13, pandas 2.3.3, FireDucks 1.4.4, NumPy 2.5.2 et PyArrow 21.0.0. Ce n’est pas une vérité universelle, c’est juste le terrain de jeu du test.
J’ai testé sept workloads assez classiques en data engineering et analytics engineering :
- Lecture Parquet, parce que c’est le format colonne standard dans beaucoup de pipelines data.
- Filtrage, parce qu’on réduit souvent un dataset avant analyse.
- Groupby faible cardinalité, typique des agrégations par pays, statut ou catégorie.
- Groupby haute cardinalité, plus proche des agrégations par utilisateur, produit ou session.
- Tri, fréquent avant export, ranking ou déduplication.
- Jointure, parce que les pipelines assemblent presque toujours une table de faits avec une table de dimensions.
- Pipeline chaîné réaliste, avec lecture, filtre, join, groupby et tri, parce que c’est là qu’un moteur optimisé peut vraiment montrer quelque chose.
import time
import statistics
import pandas as pd
import fireducks.pandas as fpd
MAIN_PATH = "data/main_10m.parquet"
LOOKUP_PATH = "data/lookup_2m.parquet"
def run_pandas():
df = pd.read_parquet(MAIN_PATH)
lookup = pd.read_parquet(LOOKUP_PATH)
out = (
df[df["amount"] > 100]
.merge(lookup, on="customer_id", how="left")
.groupby("segment", as_index=False)["amount"]
.sum()
.sort_values("amount", ascending=False)
)
return out
def run_fireducks():
df = fpd.read_parquet(MAIN_PATH)
lookup = fpd.read_parquet(LOOKUP_PATH)
out = (
df[df["amount"] > 100]
.merge(lookup, on="customer_id", how="left")
.groupby("segment", as_index=False)["amount"]
.sum()
.sort_values("amount", ascending=False)
)
# Force la matérialisation pour mesurer le vrai temps d'exécution.
return out._evaluate()
def bench(fn):
fn() # Warmup
times = []
result = None
for _ in range(5):
start = time.perf_counter()
result = fn()
times.append(time.perf_counter() - start)
return statistics.median(times), result
pandas_time, pandas_out = bench(run_pandas)
fireducks_time, fireducks_out = bench(run_fireducks)
pd.testing.assert_frame_equal(
pandas_out.reset_index(drop=True),
fireducks_out.reset_index(drop=True),
check_dtype=False
)
print("pandas:", pandas_time)
print("FireDucks:", fireducks_time)
Le point important, c’est le ._evaluate(). FireDucks peut différer certains calculs, donc je le force volontairement dans le benchmark. Sinon, je ne mesure pas la même chose que pandas.
| Bonne pratique | Pourquoi je le fais |
| Échauffement | Évite de mesurer l’initialisation à froid. |
| Plusieurs runs | Réduit l’effet du bruit machine. |
| Médiane | Donne une valeur plus robuste que le meilleur run. |
| Ordre alterné | Limite les biais liés au cache. |
| Sorties vérifiées | Un résultat faux mais rapide ne sert à rien. |
| Matérialisation explicite | Mesure le vrai temps FireDucks, pas juste la préparation. |
Quels gains peut-on attendre ?
Sur le benchmark présenté, FireDucks est beaucoup plus rapide que pandas sur la majorité des workloads testés, avec un gain moyen annoncé de 7.28x et un pic à 20.77x sur le tri. Mais je préfère le dire tout de suite : “jusqu’à 20x” ne veut pas dire “20x sur tout”. Ça veut dire qu’un cas précis, ici le tri, a atteint ce niveau dans ces conditions de test.
Les gains dépendent beaucoup de ce que vous faites vraiment avec vos données. Une lecture Parquet ne sollicite pas les mêmes mécanismes qu’un groupby, un filtre multi-colonnes ou un tri massif. La taille du dataset compte, le nombre de colonnes aussi, la cardinalité aussi. La cardinalité, c’est simplement le nombre de valeurs distinctes dans une colonne. Un groupby sur 10 catégories n’a rien à voir avec un groupby sur 10 millions d’identifiants clients.
| Workload testé | Gain annoncé vs pandas |
| Lecture Parquet | 2.66x |
| Filtrage sur plusieurs colonnes | 11.63x |
| Groupby faible cardinalité | 15.44x |
| Groupby haute cardinalité | Entrée chiffrée non exploitable ici |
| Tri | 20.77x |
| Moyenne annoncée | 7.28x |
Dans un vrai contexte business, je regarde ça de manière très pragmatique. Si un script pandas prend 20 minutes tous les matins pour préparer des fichiers de reporting, nettoyer des exports CRM ou recalculer des agrégats métier, et qu’un simple remplacement d’import réduit fortement ce temps, le gain est réel. Vous récupérez du temps machine, parfois du temps humain, et surtout vous réduisez la fenêtre d’exécution du batch.
Mais je ne mettrais pas ça en production juste parce qu’un benchmark affiche un beau multiplicateur. Il faut vérifier trois choses assez simples :
- Que le script tourne sans casser avec FireDucks.
- Que les résultats sont strictement identiques ou acceptés métier, surtout sur les dates, les types et les valeurs nulles.
- Que les fonctions pandas avancées, les UDF et les librairies tierces autour du script restent compatibles.
Ma recommandation est simple. Je testerais FireDucks sur les scripts pandas les plus coûteux, en priorité les pipelines batch. Je comparerais les sorties, les temps d’exécution et les cas limites. Puis seulement après, je déciderais si ça mérite d’être industrialisé.
Et si le plus simple était juste de tester FireDucks ?
FireDucks est intéressant parce qu’il ne demande pas forcément de repenser toute votre stack data. On garde une logique proche de pandas, on remplace souvent l’import, puis on mesure. Les gains observés sur de gros workloads sont sérieux : moyenne annoncée de 7.28x, pic à 20.77x sur le tri, très bons résultats aussi sur filtrage et groupby faible cardinalité. Mais je resterais prudent sur un point : compatibilité et équivalence des résultats doivent être vérifiées. Le vrai bénéfice pour vous, c’est simple : accélérer vos traitements pandas sans lancer une migration lourde dès le départ.
FAQ
- FireDucks remplace-t-il complètement pandas ?
Pas complètement. FireDucks reprend une API très proche de pandas, ce qui facilite les tests, mais ses objets internes sont différents. Certaines fonctions pandas ou certaines intégrations avec des bibliothèques tierces peuvent ne pas se comporter exactement pareil. Je conseille de vérifier les sorties avant de l’utiliser en production. - Comment installer FireDucks en Python ?
L’installation se fait simplement avec pip install -U fireducks. Ensuite, dans un script pandas classique, on peut tester FireDucks avec import fireducks.pandas as pd. C’est souvent le premier test à faire sur un workload existant. - Pourquoi FireDucks peut-il être plus rapide que pandas ?
FireDucks utilise une exécution paresseuse. Il collecte les opérations, construit un plan d’exécution, l’optimise, puis l’exécute en multithread sur CPU. Cette approche peut réduire les calculs intermédiaires inutiles, surtout sur les gros filtrages, groupby, tris et jointures. - FireDucks est-il toujours 20 fois plus rapide ?
Non. Le gain maximal observé dans le benchmark est de 20.77x sur le tri, mais la moyenne annoncée est de 7.28x. Les performances dépendent du type d’opération, du volume de données, de la cardinalité, de la machine et du code utilisé. - Quels traitements pandas tester en priorité avec FireDucks ?
Je commencerais par les traitements batch coûteux : lecture de gros fichiers Parquet, filtrage multi-colonnes, groupby, tri, jointures et pipelines chaînés. Ce sont les cas où FireDucks a le plus de chances d’apporter un gain visible, à condition de comparer les résultats avec pandas.
A propos de l’auteur
Je suis Franck Scandolera, expert et formateur en tracking avancé server-side, Analytics Engineering, automatisation No/Low Code avec n8n, intégration de l’IA en entreprise et SEO/GEO. Je dirige l’agence webAnalyste et l’organisme Formations Analytics. J’accompagne des équipes data, marketing et produit sur des sujets très concrets : fiabiliser les données, automatiser les traitements, accélérer les pipelines et rendre les analyses vraiment exploitables. J’ai travaillé avec des références comme Logis Hôtel, Yelloh Village, BazarChic, la Fédération Française de Football ou Texdecor. Si vous voulez accélérer vos traitements data ou intégrer l’IA proprement dans votre business, contactez-moi.
⭐ Data Analyst, Analytics Engineer et expert dans l’automatisation IA ⭐
Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
Data Analyst & Analytics engineering : tracking propre RGPD, entrepôt de données (GTM server, BigQuery…), modèles (dbt/Dataform), dashboards décisionnels (Looker, SQL, Python).
Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, Make, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.





