{"id":1250,"date":"2026-08-21T14:28:30","date_gmt":"2026-08-21T14:28:30","guid":{"rendered":"https:\/\/matforge.org\/?p=1250","raw":"https:\/\/matforge.org\/?p=1250"},"modified":"2026-08-21T14:28:30","modified_gmt":"2026-08-21T14:28:30","slug":"scientific-computing-performance-profiling-identifying-bottlenecks","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/","title":{"rendered":"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d&rsquo;\u00e9tranglement dans les solveurs PDE","raw":"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d'\u00e9tranglement dans les solveurs PDE"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>profil avant d&rsquo;optimiser. Ne devinez pas quelle partie de votre solveur PDE est lente. Mesurez-le d&rsquo;abord. Le v\u00e9ritable goulot d&rsquo;\u00e9tranglement n&rsquo;est souvent pas celui que vous attendez.<\/li>\n<li>Les profileurs Python sont pratiques. Des outils tels que <code>cProfile<\/code>, <code>py-spy<\/code>, <code>scalene<\/code> et <code>SnakeViz<\/code> prennent chacun en charge des besoins de profilage diff\u00e9rents.<\/li>\n<li>Les goulots d&rsquo;\u00e9tranglement courants du solveur PDE comprennent l&rsquo;assemblage de la matrice, les it\u00e9rations de solveur lin\u00e9aire, la surcharge de niveau Python dans la construction d&rsquo;\u00e9quations et les mod\u00e8les d&rsquo;allocation de m\u00e9moire.<\/li>\n<li>Le flux de travail Measure-Diagnose-Treat transforme de vagues probl\u00e8mes de performances en r\u00e9sultats concrets et r\u00e9parables.<\/li>\n<li>La mise \u00e0 l&rsquo;\u00e9chelle change ce qui est lent. Un solveur qui se sent rapide sur une petite grille peut exposer diff\u00e9rents goulots d&rsquo;\u00e9tranglement \u00e0 des tailles de probl\u00e8me r\u00e9alistes.<\/li>\n<\/ul>\n<h2>Votre solveur est lent. Et maintenant ?<\/h2>\n<p>Vous configurez une simulation. Vous l&rsquo;ex\u00e9cutez. Ensuite, cela prend beaucoup trop de temps.<\/p>\n<p>L&rsquo;instinct naturel est de commencer \u00e0 changer de code. Vous voudrez peut-\u00eatre vectoriser des boucles, \u00e9changer des solveurs ou ajouter du parall\u00e9lisme. Mais il y a un probl\u00e8me que de nombreux chercheurs sautent&nbsp;: vous ne savez peut-\u00eatre pas ce qui est r\u00e9ellement lent.<\/p>\n<p>La partie qui ressemble au goulot d&rsquo;\u00e9tranglement peut ne prendre qu&rsquo;une petite partie du temps d&rsquo;ex\u00e9cution. Pendant ce temps, une \u00e9tape d&rsquo;assemblage de matrice cach\u00e9e peut consommer la majeure partie du temps d&rsquo;ex\u00e9cution.<\/p>\n<p>Le profilage des performances n&rsquo;est pas facultatif. C&rsquo;est l&rsquo;une des \u00e9tapes les plus importantes pour rendre un solveur PDE plus rapide, et il est plus facile que ne le pensent de nombreux chercheurs en Python.<\/p>\n<p>Ce guide explique les outils, le flux de travail et les goulots d&rsquo;\u00e9tranglement courants que vous pouvez rencontrer lors du profilage du code Python scientifique.<\/p>\n<h2>Qu&rsquo;est-ce qu&rsquo;un profileur et pourquoi est-ce important ?<\/h2>\n<p>Un profileur est un outil qui enregistre les fonctions que votre programme appelle, la dur\u00e9e de chaque fonction et la fr\u00e9quence \u00e0 laquelle chaque fonction est invoqu\u00e9e. Il produit un rapport, souvent en texte brut ou sous forme de graphique visuel interactif, qui indique o\u00f9 votre code passe du temps.<\/p>\n<p>Sans profileur, vous optimisez en fonction de l&rsquo;intuition. Dans le travail de performance, l&rsquo;intuition est souvent erron\u00e9e. Vous pouvez passer des heures \u00e0 am\u00e9liorer une fonction qui ne prend qu&rsquo;une petite partie du temps d&rsquo;ex\u00e9cution tout en ignorant la fonction qui domine l&rsquo;ensemble de l&rsquo;ex\u00e9cution.<\/p>\n<p>Avec un profileur, vous voyez les donn\u00e9es. Vous arr\u00eatez de deviner et commencez \u00e0 cibler de vrais probl\u00e8mes de performances.<\/p>\n<h2>Le flux de travail de profilage : mesurer, diagnostiquer, traiter<\/h2>\n<p>Avant de choisir un outil, il est utile de comprendre le flux de travail. Un processus de profilage pratique comporte trois \u00e9tapes :<\/p>\n<ol>\n<li>mesurer. Utilisez un profileur pour trouver quelle partie du code est r\u00e9ellement lente.<\/li>\n<li>Diagnostiquer. Comprenez pourquoi il est lent. La cause peut \u00eatre l&rsquo;allocation de m\u00e9moire, le choix de l&rsquo;algorithme, la surcharge de niveau Python ou la configuration du solveur.<\/li>\n<li>traiter. Corrigez la cause premi\u00e8re au lieu d&rsquo;appliquer des optimisations al\u00e9atoires.<\/li>\n<\/ol>\n<p>Ceci est similaire \u00e0 un diagnostic m\u00e9dical. Un m\u00e9decin ne commence pas le traitement avant de v\u00e9rifier les sympt\u00f4mes et les r\u00e9sultats des tests. Le profilage fonctionne de la m\u00eame mani\u00e8re. Vous mesurez avant de modifier le code.<\/p>\n<p>Un d\u00e9tail cl\u00e9 est la taille du probl\u00e8me. Votre ex\u00e9cution de profilage doit utiliser une taille de probl\u00e8me qui repr\u00e9sente votre charge de travail r\u00e9elle. Si vous ne profilez qu&rsquo;avec une petite grille, vous risquez de manquer les goulots d&rsquo;\u00e9tranglement qui n&rsquo;apparaissent qu&rsquo;\u00e0 l&rsquo;\u00e9chelle.<\/p>\n<h2>Outils de profilage Python : la bo\u00eete \u00e0 outils pratique<\/h2>\n<p>Python a plusieurs options de profilage utiles. Pour le calcul scientifique, les outils suivants sont particuli\u00e8rement pratiques.<\/p>\n<h3>Cprofile : int\u00e9gr\u00e9, z\u00e9ro installation, toujours disponible<\/h3>\n<p><code>cProfile<\/code> est livr\u00e9 avec chaque installation Python. Il s&rsquo;agit d&rsquo;une extension C qui se situe entre l&rsquo;interpr\u00e9teur et votre code, comptant les op\u00e9rations avec des frais g\u00e9n\u00e9raux relativement faibles.<\/p>\n<pre><code class=\"language-python\">import cProfile\n\n# Profile a single call\ncProfile.run('equation.solve(var=phi, dt=timeStep)', 'fi_py_profile.prof')\n<\/code><\/pre>\n<p>Vous pouvez \u00e9galement l&rsquo;ex\u00e9cuter \u00e0 partir de la ligne de commande&nbsp;:<\/p>\n<pre><code class=\"language-bash\">$ python -m cProfile -s time my_solver.py 0 1.0 0.1 1000000 output.dat | head -n 20\n<\/code><\/pre>\n<p><code>cProfile<\/code> est le meilleur pour un profilage rapide en premier. Vous n&rsquo;avez pas besoin d&rsquo;installer quoi que ce soit et cela peut attraper des goulots d&rsquo;\u00e9tranglement \u00e9vidents.<\/p>\n<p>Les options de tri sont importantes. <code>-s time<\/code> Affiche l&rsquo;heure interne. <code>-s cumulative<\/code> Affiche le temps total, y compris les sous-appels. <code>-s ncalls<\/code> Affiche le nombre d&rsquo;appels. Choisissez l&rsquo;option qui r\u00e9pond \u00e0 votre question.<\/p>\n<h3>Py-Spy : profileur d&rsquo;\u00e9chantillonnage en direct et \u00e0 faibles frais g\u00e9n\u00e9raux<\/h3>\n<p><code>py-spy<\/code> est un profileur d&rsquo;\u00e9chantillonnage \u00e9crit en rouille. Il peut surveiller un processus Python en cours d&rsquo;ex\u00e9cution sans le red\u00e9marrer. Vous l&rsquo;attachez, enregistrez le processus et obtenez une sortie visuelle.<\/p>\n<pre><code class=\"language-bash\">$ pip install py-spy\n$ py-spy dump -- python my_solver.py\n$ py-spy record -o profile.svg -- python my_solver.py\n<\/code><\/pre>\n<p><code>py-spy<\/code> est utile pour le code de production, les simulations \u00e0 long terme o\u00f9 le red\u00e9marrage est peu pratique et la d\u00e9tection en temps r\u00e9el des goulots d&rsquo;\u00e9tranglement.<\/p>\n<p>Les scientifiques l&rsquo;aiment souvent parce qu&rsquo;il ne n\u00e9cessite pas de modifications de code, ne red\u00e9marre pas le programme et a peu de frais g\u00e9n\u00e9raux.<\/p>\n<h3>Scalene : CPU, GPU et m\u00e9moire dans un seul outil<\/h3>\n<p><code>scalene<\/code> est un profileur haute performance qui mesure l&rsquo;utilisation du processeur, l&rsquo;utilisation du GPU et l&rsquo;allocation de m\u00e9moire. Il produit des pannes ligne par ligne et peut aider \u00e0 identifier les fuites de m\u00e9moire.<\/p>\n<pre><code class=\"language-bash\">$ pip install scalene\n$ scalene my_solver.py\n<\/code><\/pre>\n<p><code>scalene<\/code> est utile pour les charges de travail acc\u00e9l\u00e9r\u00e9es par GPU, les simulations lourdes en m\u00e9moire et les cas o\u00f9 vous avez besoin d&rsquo;une analyse CPU et de m\u00e9moire dans un seul outil.<\/p>\n<p>Cela compte parce que les goulots d&rsquo;\u00e9tranglement en python scientifique ne sont pas toujours de purs probl\u00e8mes de CPU. Une op\u00e9ration de tableau dense peut passer plus de temps \u00e0 allouer des tableaux temporaires qu&rsquo;\u00e0 effectuer des calculs.<\/p>\n<h3>Snakeviz : r\u00e9sultats visuels<\/h3>\n<p><code>cProfile<\/code> La sortie est bas\u00e9e sur le texte. <code>SnakeViz<\/code> convertit cette sortie en un graphique visuel interactif. Vous pouvez inspecter les appels de fonctions imbriqu\u00e9s, comparer le temps pass\u00e9 dans diff\u00e9rentes branches et identifier rapidement les puits de temps profonds.<\/p>\n<pre><code class=\"language-bash\">$ pip install snakeviz\n$ snakeviz fi_py_profile.prof\n<\/code><\/pre>\n<p><code>SnakeViz<\/code> est utile lorsque vous devez pr\u00e9senter des r\u00e9sultats de profilage \u00e0 des collaborateurs, comprendre les hi\u00e9rarchies d&rsquo;appels ou trouver des mod\u00e8les difficiles \u00e0 lire dans la sortie du terminal.<\/p>\n<h3>line_profiler&nbsp;: d\u00e9tail ligne par ligne<\/h3>\n<p><code>line_profiler<\/code> donne des d\u00e9tails au niveau de la fonction au niveau de la ligne individuelle. Il est plus lent que <code>cProfile<\/code>, mais il montre exactement quelle ligne est ch\u00e8re.<\/p>\n<pre><code class=\"language-python\">from line_profiler import LineProfiler\n\nlp = LineProfiler()\nlp.add_function(my_heavy_function)\nlp.enable_by_count()\n\n# Run your code\nresult = equation.solve(var=phi)\nlp.print_stats()\n<\/code><\/pre>\n<p><code>line_profiler<\/code> est le meilleur pour une enqu\u00eate approfondie sur une fonction apr\u00e8s que vous sachiez d\u00e9j\u00e0 quelle partie du programme est lente.<\/p>\n<h2>Goulots d&rsquo;\u00e9tranglement communs de solveurs PDE<\/h2>\n<p>Lorsque vous profilez des solveurs PDE bas\u00e9s sur Python tels que Fipy, Fenics ou des impl\u00e9mentations personnalis\u00e9es, plusieurs goulots d&rsquo;\u00e9tranglement apparaissent souvent.<\/p>\n<h3>1. Frais g\u00e9n\u00e9raux d&rsquo;assemblage de matrice<\/h3>\n<p>L&rsquo;assemblage matriciel est l&rsquo;une des surprises les plus courantes. De nombreux chercheurs s&rsquo;attendent \u00e0 ce que le solveur lin\u00e9aire domine le temps d&rsquo;ex\u00e9cution. Au lieu de cela, le code qui construit la matrice peut prendre plus de temps que la r\u00e9solution elle-m\u00eame.<\/p>\n<p>Dans FIPY, la phase <code>equation.prepare()<\/code> peut consommer une part importante du temps d&rsquo;ex\u00e9cution avant la fin de <code>equation.solve()<\/code>. Si la phase de pr\u00e9paration domine, le goulot d&rsquo;\u00e9tranglement peut \u00eatre dans la construction d&rsquo;\u00e9quations au niveau de Python plut\u00f4t que dans le solveur num\u00e9rique.<\/p>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Op\u00e9rations par lots au lieu de boucler les variables de maillage en Python Pure.<\/li>\n<li>Utilisez des termes sources vectoris\u00e9es et \u00e9vitez les boucles Python.<\/li>\n<li>Consid\u00e9rez des \u00e9quations enti\u00e8rement implicites lorsque des termes sources explicites forcent de petits ajustements de pas de temps fr\u00e9quents.<\/li>\n<\/ul>\n<h3>2. Performance du solveur lin\u00e9aire<\/h3>\n<p>Lorsque l&rsquo;assemblage matriciel n&rsquo;est pas le probl\u00e8me principal, le solveur lin\u00e9aire peut l&rsquo;\u00eatre. Les d\u00e9l\u00e9gu\u00e9s \u00e0 l&rsquo;\u00e9tape <code>equation.solve()<\/code> travaillent dans un backend tel que <code>scipy.sparse.linalg<\/code>, Trilinos, PySparse ou PyAMG.<\/p>\n<p>Si vous passez \u00e0 une acc\u00e9l\u00e9ration GPU ou \u00e0 un autre backend, v\u00e9rifiez o\u00f9 se trouve la surcharge de s\u00e9rie. Un solveur peut sembler rapide isol\u00e9ment, mais perd toujours du temps lors de la construction de la matrice ou du transfert de donn\u00e9es.<\/p>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Testez diff\u00e9rents backends de solveur en fonction de l&rsquo;\u00e9chelle du probl\u00e8me.<\/li>\n<li>Utilisez les pr\u00e9conditionneurs le cas \u00e9ch\u00e9ant.<\/li>\n<li>Comparez le temps total de construction et de r\u00e9solution, pas seulement le temps d&rsquo;it\u00e9ration du solveur.<\/li>\n<\/ul>\n<h3>3. Mod\u00e8les d&rsquo;allocation de m\u00e9moire<\/h3>\n<p>Le collecteur et l&rsquo;allocateur de Python peuvent dominer le runtime si le code cr\u00e9e et rejette de mani\u00e8re r\u00e9p\u00e9t\u00e9e de grands tableaux. Ceci est courant dans les boucles de temps, les solveurs it\u00e9ratifs et les op\u00e9rations de maillage avec des structures de donn\u00e9es fragment\u00e9es.<\/p>\n<p>Les probl\u00e8mes d&rsquo;allocation de m\u00e9moire apparaissent souvent dans :<\/p>\n<ul>\n<li>Solveurs it\u00e9ratifs avec vecteurs temporaires.<\/li>\n<li>Boucles de temps qui r\u00e9allouent des tableaux \u00e0 chaque \u00e9tape.<\/li>\n<li>Op\u00e9rations de maillage qui cr\u00e9ent des structures interm\u00e9diaires fragment\u00e9es.<\/li>\n<\/ul>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Pr\u00e9-allouer des tableaux avant les boucles temporelles.<\/li>\n<li>Utilisez <code>tracemalloc<\/code> pour identifier les hotspots d&rsquo;allocation.<\/li>\n<li>Utilisez <code>scalene<\/code> pour un profilage plus large de la m\u00e9moire.<\/li>\n<li>\u00c9vitez de cr\u00e9er de nouveaux tableaux dans les boucles internes lorsque des tampons r\u00e9utilisables sont possibles.<\/li>\n<\/ul>\n<h3>4. Au-dessus de la boucle de niveau Python<\/h3>\n<p>Python est rapide lorsque le travail est pouss\u00e9 dans des op\u00e9rations vectoris\u00e9es de NumPy. Il est lent lorsque vous bouclez sur des objets Python cellule par cellule. Si votre discr\u00e9tisation passe par des cellules en Python pur, vous risquez de perdre des performances significatives par rapport aux alternatives vectoris\u00e9es.<\/p>\n<pre><code class=\"language-python\"># Slow: Python-level loop\nfor cell in mesh.cells:\n    value[cell] = compute_stencil(cell)\n\n# Fast: Vectorized\nstencils = compute_stencils(mesh)\nvalues = apply_stencil(stencils)\n<\/code><\/pre>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>D\u00e9placez les boucles dans des extensions compil\u00e9es avec des outils tels que Cython ou Numba.<\/li>\n<li>Utilisez les op\u00e9rations vectoris\u00e9es de Fipy au lieu d&rsquo;une it\u00e9ration au niveau Python.<\/li>\n<li>Profil d&rsquo;abord, car parfois la boucle n&rsquo;est pas le v\u00e9ritable goulot d&rsquo;\u00e9tranglement.<\/li>\n<\/ul>\n<h3>5. Conversion d&rsquo;E\/S et de donn\u00e9es<\/h3>\n<p>Les goulots d&rsquo;\u00e9tranglement d&rsquo;E\/S peuvent rester cach\u00e9s jusqu&rsquo;\u00e0 ce que le flux de travail s&rsquo;adapte. Si le code convertit des donn\u00e9es de maillage, \u00e9crit des r\u00e9sultats interm\u00e9diaires ou lit des fichiers de param\u00e8tres volumineux \u00e0 plusieurs reprises, les E\/S peuvent dominer l&rsquo;ex\u00e9cution.<\/p>\n<pre><code class=\"language-python\"># This might look fast in isolation\nstart = time.time()\nimport numpy as np\ndata = np.load('large_mesh_data.npy')\nprint(f\"Loading took {time.time() - start:.3f}s\")  # Outputs: 0.001s\n\n# But if you do this inside a loop 1000 times: 1000x overhead\n<\/code><\/pre>\n<p>La cl\u00e9 est de profiler le flux de travail complet, pas seulement le noyau num\u00e9rique. Le chargement, la conversion et l&rsquo;\u00e9criture r\u00e9p\u00e9t\u00e9s peuvent prendre plus de temps que pr\u00e9vu.<\/p>\n<h2>Un exemple de profilage pratique<\/h2>\n<p>Voici un moyen pratique de profiler une simulation FIPY.<\/p>\n<pre><code class=\"language-python\">import cProfile\nimport pstats\nimport fipy as fp\n\n# Create a simple diffusion problem\nnx = 100\ndx = 0.01\nmesh = fp.GridMesh(nx, dx)\nvar = fp.CellVariable(name=\"phi\", mesh=mesh)\n\n# Set up equation\nequation = fp.TransientDiffusionTerm(var)\n\n# Profile the solve\ncProfile.run('equation.solve(var=var, dt=0.001)', 'diffusion_profile.prof')\n\n# Analyze\nwith pstats.Stats('diffusion_profile.prof') as stats:\n    stats.sort_stats('cumulative')  # or 'time', 'ncalls', etc.\n    stats.print_stats(20)  # Top 20 functions\n<\/code><\/pre>\n<p>Ouvrez ensuite le profil dans <code>SnakeViz<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-bash\">$ snakeviz diffusion_profile.prof\n<\/code><\/pre>\n<p>Le rapport visuel peut afficher :<\/p>\n<ul>\n<li>Quelles branches de fonction prennent le plus de temps.<\/li>\n<li>Que le goulot d&rsquo;\u00e9tranglement soit \u00e0 l&rsquo;int\u00e9rieur <code>equation.solve()<\/code> ou dans l&rsquo;\u00e9tape de pr\u00e9paration.<\/li>\n<li>Combien de temps est pass\u00e9 dans Numpy par rapport au code de niveau Python.<\/li>\n<\/ul>\n<p>Dans FIPY, l&rsquo;\u00e9tape de pr\u00e9paration montre souvent qu&rsquo;une grande partie du temps est consacr\u00e9e \u00e0 la construction de la matrice clairsem\u00e9e et \u00e0 l&rsquo;application des conditions aux limites, et non dans la r\u00e9solution lin\u00e9aire elle-m\u00eame. C&rsquo;est pourquoi l&rsquo;optimisation du solveur peut manquer le v\u00e9ritable goulot d&rsquo;\u00e9tranglement.<\/p>\n<h2>Profilage \u00e0 grande \u00e9chelle&nbsp;: lorsque votre simulation prend des heures<\/h2>\n<p>Le plus grand d\u00e9fi avec le profilage scientifique n&rsquo;est pas toujours l&rsquo;outil. C&rsquo;est le temps d&rsquo;ex\u00e9cution. Certaines simulations durent des heures et le profilage de la totalit\u00e9 de la simulation de production peut produire une \u00e9norme production.<\/p>\n<p>Les simulations longues n\u00e9cessitent une strat\u00e9gie de profilage plus minutieuse.<\/p>\n<h3>La solution de contournement&nbsp;: profiler un cas r\u00e9duit<\/h3>\n<ol>\n<li>R\u00e9duisez la r\u00e9solution du maillage ou le nombre de pas de temps.<\/li>\n<li>Ex\u00e9cutez le profileur sur ce petit cas.<\/li>\n<li>Recherchez des mod\u00e8les structurels dans lesquels les op\u00e9rations dominent proportionnellement.<\/li>\n<li>Extrapolez soigneusement, car les proportions peuvent \u00eatre valables m\u00eame lorsque les temps absolus changent.<\/li>\n<\/ol>\n<p>Il y a une mise en garde. Les petits cas peuvent cacher les goulots d&rsquo;\u00e9tranglement qui n&rsquo;apparaissent qu&rsquo;\u00e0 plus grande \u00e9chelle. Ceux-ci peuvent inclure une surcharge de communication dans des solveurs parall\u00e8les, des erreurs de cache sur de grands r\u00e9seaux ou une pression de m\u00e9moire provenant de repr\u00e9sentations interm\u00e9diaires denses.<\/p>\n<h3>La solution de contournement&nbsp;: profiler une tranche repr\u00e9sentative<\/h3>\n<p>Si vous ex\u00e9cutez une simulation transitoire avec 10&nbsp;000 pas de temps, vous n&rsquo;avez pas toujours besoin de profiler l&rsquo;ensemble de l&rsquo;ex\u00e9cution. A la place :<\/p>\n<ul>\n<li>Profilez uniquement les 100 premi\u00e8res \u00e9tapes.<\/li>\n<li>Ex\u00e9cutez suffisamment d&rsquo;it\u00e9rations afin que les frais g\u00e9n\u00e9raux de profileur soient faibles par rapport au travail r\u00e9el.<\/li>\n<li>V\u00e9rifiez si la r\u00e9partition du temps reste coh\u00e9rente \u00e0 mesure que le nombre d&rsquo;\u00e9tapes augmente.<\/li>\n<\/ul>\n<h2>Choisir le profileur adapt\u00e9 \u00e0 votre cas d&rsquo;utilisation<\/h2>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Sc\u00e9nario<\/th>\n<th>Outil recommand\u00e9<\/th>\n<th>Pourquoi<\/th>\n<\/tr>\n<tr>\n<td>V\u00e9rification rapide, pas d&rsquo;installation<\/td>\n<td><code>cProfile<\/code><\/td>\n<td>Int\u00e9gr\u00e9, z\u00e9ro installation, toujours disponible<\/td>\n<\/tr>\n<tr>\n<td>Code de production, ne peut pas red\u00e9marrer<\/td>\n<td><code>py-spy<\/code><\/td>\n<td>Peut s&rsquo;attacher \u00e0 un processus en cours d&rsquo;ex\u00e9cution avec une surcharge minimale<\/td>\n<\/tr>\n<tr>\n<td>Profilage du GPU, du CPU et de la m\u00e9moire<\/td>\n<td><code>scalene<\/code><\/td>\n<td>Tout-en-un, compatible avec le GPU, le profilage au niveau de la ligne<\/td>\n<\/tr>\n<tr>\n<td>Pr\u00e9sentation des r\u00e9sultats aux collaborateurs<\/td>\n<td><code>cProfile<\/code> + <code>SnakeViz<\/code><\/td>\n<td>Visuel, interactif et plus facile \u00e0 expliquer<\/td>\n<\/tr>\n<tr>\n<td>Plong\u00e9e profonde dans une seule fonction<\/td>\n<td><code>line_profiler<\/code><\/td>\n<td>D\u00e9tail ligne par ligne<\/td>\n<\/tr>\n<tr>\n<td>Mod\u00e8les d&rsquo;allocation de m\u00e9moire<\/td>\n<td><code>scalene<\/code> ou <code>tracemalloc<\/code><\/td>\n<td>Suivi des allocations, des fuites et de la fragmentation<\/td>\n<\/tr>\n<tr>\n<td>Simulation de longue dur\u00e9e<\/td>\n<td><code>py-spy<\/code> Plus r\u00e9duit <code>cProfile<\/code><\/td>\n<td>Faible \u00e9chantillonnage des frais g\u00e9n\u00e9raux et repr\u00e9sentatif<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Ce qu&rsquo;il faut \u00e9viter&nbsp;: les erreurs de profilage courantes<\/h2>\n<p>Erreur 1 : Profilage d&rsquo;un probl\u00e8me trop faible. Un maillage 10 \u00d7 10 qui se termine en moins d&rsquo;une seconde ne r\u00e9v\u00e9lera pas les goulots d&rsquo;\u00e9tranglement qui apparaissent \u00e0 l&rsquo;\u00e9chelle de 1&nbsp;000&nbsp;\u00d7&nbsp;1&nbsp;000. profil \u00e0 une taille repr\u00e9sentative lorsque cela est possible.<\/p>\n<p>Erreur&nbsp;2&nbsp;: Optimisation avant le profilage. Si vous modifiez des solveurs, ajoutez du parall\u00e9lisme ou r\u00e9\u00e9crivez des boucles avant de collecter des donn\u00e9es de profil, vous devinez.<\/p>\n<p>Erreur 3 : Ignorer la phase de pr\u00e9paration. De nombreux chercheurs ne profilent que <code>equation.solve()<\/code>, mais la pr\u00e9paration peut prendre plus de temps que la solution. Profilez le pipeline complet.<\/p>\n<p>Erreur 4&nbsp;: Confondre le plus rapidement isol\u00e9 et le plus rapide dans l&rsquo;ensemble. Un solveur avec moins d&rsquo;it\u00e9rations peut encore \u00eatre plus lent s&rsquo;il n\u00e9cessite un assemblage de matrice ou une conversion de donn\u00e9es co\u00fbteux.<\/p>\n<p>Erreur 5 : Profilage une seule fois. Profil Avant l&rsquo;optimisation, effectuez une modification, puis \u00e0 nouveau profil. V\u00e9rifiez que le goulot d&rsquo;\u00e9tranglement est r\u00e9ellement d\u00e9plac\u00e9 ou am\u00e9lior\u00e9.<\/p>\n<h2>R\u00e9f\u00e9rences internes<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Qu&rsquo;est-ce que FIPY et quand devriez-vous l&rsquo;utiliser&nbsp;?<\/a> &#8211; Comprendre l&rsquo;architecture de Fipy et les op\u00e9rations vectoris\u00e9es.<\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Acc\u00e9l\u00e9ration GPU pour les simulations FIPY&nbsp;: cupy et numba Integration Guide<\/a> : consid\u00e9rations de performances pour les flux de travail acc\u00e9l\u00e9r\u00e9s par GPU.<\/li>\n<li><a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">Validation et v\u00e9rification des simulations PDE&nbsp;: un cadre pratique<\/a> \u2014 s&rsquo;assurer que les r\u00e9sultats du solveur sont corrects avant de les optimiser.<\/li>\n<\/ul>\n<h2>R\u00e9sum\u00e9&nbsp;: Le bon ordre est important<\/h2>\n<p>Le profilage des performances ne consiste pas \u00e0 trouver l&rsquo;astuce la plus rapide. C&rsquo;est une question de discipline.<\/p>\n<ol>\n<li>mesurer. Ex\u00e9cutez <code>cProfile<\/code>, <code>py-spy<\/code> ou <code>scalene<\/code> sur des tailles de probl\u00e8me repr\u00e9sentatives.<\/li>\n<li>Diagnostiquer. Lisez attentivement les r\u00e9sultats. La fonction top n&rsquo;est pas toujours le v\u00e9ritable goulot d&rsquo;\u00e9tranglement.<\/li>\n<li>traiter. Fixez ce que vous avez mesur\u00e9, pas ce que vous pensiez.<\/li>\n<li>mesurer \u00e0 nouveau. V\u00e9rifiez que votre correctif vous a r\u00e9ellement aid\u00e9.<\/li>\n<\/ol>\n<p>L&rsquo;aper\u00e7u le plus pr\u00e9cieux du profilage est simple&nbsp;: la partie la plus lente de votre code est rarement la partie que vous pensiez lente. Une fois que vous avez des donn\u00e9es, l&rsquo;optimisation cesse d&rsquo;\u00eatre une hypoth\u00e8se et commence \u00e0 \u00eatre ing\u00e9nierie.<\/p>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/SOLVERS.html\">FIPY Performance Profiling and Solver Goulot d&rsquo;\u00e9tranglement<\/a> \u2014 Documentation FIPY du NIST sur la s\u00e9lection des solveurs et les mod\u00e8les de performances.<\/li>\n<li><a href=\"https:\/\/aaltoscicomp.github.io\/python-for-scicomp\/profiling\/\">profilage du code Python<\/a> &#8211; Guide de mesure, de diagnostic et de traitement des probl\u00e8mes de performances de l&rsquo;Universit\u00e9 Aalto.<\/li>\n<li><a href=\"https:\/\/edbennett.github.io\/high-performance-python\/05-profiling\/index.html\">Python haute performance&nbsp;: profilage pour identifier les goulots d&rsquo;\u00e9tranglement<\/a> &#8211; Proc\u00e9dure pas \u00e0 pas de style atelier du d\u00e9but \u00e0 Tableau des flammes.<\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>profil avant d'optimiser. Ne devinez pas quelle partie de votre solveur PDE est lente. Mesurez-le d'abord. Le v\u00e9ritable goulot d'\u00e9tranglement n'est souvent pas celui que vous attendez.<\/li>\n<li>Les profileurs Python sont pratiques. Des outils tels que <code>cProfile<\/code>, <code>py-spy<\/code>, <code>scalene<\/code> et <code>SnakeViz<\/code> prennent chacun en charge des besoins de profilage diff\u00e9rents.<\/li>\n<li>Les goulots d'\u00e9tranglement courants du solveur PDE comprennent l'assemblage de la matrice, les it\u00e9rations de solveur lin\u00e9aire, la surcharge de niveau Python dans la construction d'\u00e9quations et les mod\u00e8les d'allocation de m\u00e9moire.<\/li>\n<li>Le flux de travail Measure-Diagnose-Treat transforme de vagues probl\u00e8mes de performances en r\u00e9sultats concrets et r\u00e9parables.<\/li>\n<li>La mise \u00e0 l'\u00e9chelle change ce qui est lent. Un solveur qui se sent rapide sur une petite grille peut exposer diff\u00e9rents goulots d'\u00e9tranglement \u00e0 des tailles de probl\u00e8me r\u00e9alistes.<\/li>\n<\/ul>\n<h2>Votre solveur est lent. Et maintenant ?<\/h2>\n<p>Vous configurez une simulation. Vous l'ex\u00e9cutez. Ensuite, cela prend beaucoup trop de temps.<\/p>\n<p>L'instinct naturel est de commencer \u00e0 changer de code. Vous voudrez peut-\u00eatre vectoriser des boucles, \u00e9changer des solveurs ou ajouter du parall\u00e9lisme. Mais il y a un probl\u00e8me que de nombreux chercheurs sautent&nbsp;: vous ne savez peut-\u00eatre pas ce qui est r\u00e9ellement lent.<\/p>\n<p>La partie qui ressemble au goulot d'\u00e9tranglement peut ne prendre qu'une petite partie du temps d'ex\u00e9cution. Pendant ce temps, une \u00e9tape d'assemblage de matrice cach\u00e9e peut consommer la majeure partie du temps d'ex\u00e9cution.<\/p>\n<p>Le profilage des performances n'est pas facultatif. C'est l'une des \u00e9tapes les plus importantes pour rendre un solveur PDE plus rapide, et il est plus facile que ne le pensent de nombreux chercheurs en Python.<\/p>\n<p>Ce guide explique les outils, le flux de travail et les goulots d'\u00e9tranglement courants que vous pouvez rencontrer lors du profilage du code Python scientifique.<\/p>\n<h2>Qu'est-ce qu'un profileur et pourquoi est-ce important ?<\/h2>\n<p>Un profileur est un outil qui enregistre les fonctions que votre programme appelle, la dur\u00e9e de chaque fonction et la fr\u00e9quence \u00e0 laquelle chaque fonction est invoqu\u00e9e. Il produit un rapport, souvent en texte brut ou sous forme de graphique visuel interactif, qui indique o\u00f9 votre code passe du temps.<\/p>\n<p>Sans profileur, vous optimisez en fonction de l'intuition. Dans le travail de performance, l'intuition est souvent erron\u00e9e. Vous pouvez passer des heures \u00e0 am\u00e9liorer une fonction qui ne prend qu'une petite partie du temps d'ex\u00e9cution tout en ignorant la fonction qui domine l'ensemble de l'ex\u00e9cution.<\/p>\n<p>Avec un profileur, vous voyez les donn\u00e9es. Vous arr\u00eatez de deviner et commencez \u00e0 cibler de vrais probl\u00e8mes de performances.<\/p>\n<h2>Le flux de travail de profilage : mesurer, diagnostiquer, traiter<\/h2>\n<p>Avant de choisir un outil, il est utile de comprendre le flux de travail. Un processus de profilage pratique comporte trois \u00e9tapes :<\/p>\n<ol>\n<li>mesurer. Utilisez un profileur pour trouver quelle partie du code est r\u00e9ellement lente.<\/li>\n<li>Diagnostiquer. Comprenez pourquoi il est lent. La cause peut \u00eatre l'allocation de m\u00e9moire, le choix de l'algorithme, la surcharge de niveau Python ou la configuration du solveur.<\/li>\n<li>traiter. Corrigez la cause premi\u00e8re au lieu d'appliquer des optimisations al\u00e9atoires.<\/li>\n<\/ol>\n<p>Ceci est similaire \u00e0 un diagnostic m\u00e9dical. Un m\u00e9decin ne commence pas le traitement avant de v\u00e9rifier les sympt\u00f4mes et les r\u00e9sultats des tests. Le profilage fonctionne de la m\u00eame mani\u00e8re. Vous mesurez avant de modifier le code.<\/p>\n<p>Un d\u00e9tail cl\u00e9 est la taille du probl\u00e8me. Votre ex\u00e9cution de profilage doit utiliser une taille de probl\u00e8me qui repr\u00e9sente votre charge de travail r\u00e9elle. Si vous ne profilez qu'avec une petite grille, vous risquez de manquer les goulots d'\u00e9tranglement qui n'apparaissent qu'\u00e0 l'\u00e9chelle.<\/p>\n<h2>Outils de profilage Python : la bo\u00eete \u00e0 outils pratique<\/h2>\n<p>Python a plusieurs options de profilage utiles. Pour le calcul scientifique, les outils suivants sont particuli\u00e8rement pratiques.<\/p>\n<h3>Cprofile : int\u00e9gr\u00e9, z\u00e9ro installation, toujours disponible<\/h3>\n<p><code>cProfile<\/code> est livr\u00e9 avec chaque installation Python. Il s'agit d'une extension C qui se situe entre l'interpr\u00e9teur et votre code, comptant les op\u00e9rations avec des frais g\u00e9n\u00e9raux relativement faibles.<\/p>\n<pre><code class=\"language-python\">import cProfile\n\n# Profile a single call\ncProfile.run('equation.solve(var=phi, dt=timeStep)', 'fi_py_profile.prof')\n<\/code><\/pre>\n<p>Vous pouvez \u00e9galement l'ex\u00e9cuter \u00e0 partir de la ligne de commande&nbsp;:<\/p>\n<pre><code class=\"language-bash\">$ python -m cProfile -s time my_solver.py 0 1.0 0.1 1000000 output.dat | head -n 20\n<\/code><\/pre>\n<p><code>cProfile<\/code> est le meilleur pour un profilage rapide en premier. Vous n'avez pas besoin d'installer quoi que ce soit et cela peut attraper des goulots d'\u00e9tranglement \u00e9vidents.<\/p>\n<p>Les options de tri sont importantes. <code>-s time<\/code> Affiche l'heure interne. <code>-s cumulative<\/code> Affiche le temps total, y compris les sous-appels. <code>-s ncalls<\/code> Affiche le nombre d'appels. Choisissez l'option qui r\u00e9pond \u00e0 votre question.<\/p>\n<h3>Py-Spy : profileur d'\u00e9chantillonnage en direct et \u00e0 faibles frais g\u00e9n\u00e9raux<\/h3>\n<p><code>py-spy<\/code> est un profileur d'\u00e9chantillonnage \u00e9crit en rouille. Il peut surveiller un processus Python en cours d'ex\u00e9cution sans le red\u00e9marrer. Vous l'attachez, enregistrez le processus et obtenez une sortie visuelle.<\/p>\n<pre><code class=\"language-bash\">$ pip install py-spy\n$ py-spy dump -- python my_solver.py\n$ py-spy record -o profile.svg -- python my_solver.py\n<\/code><\/pre>\n<p><code>py-spy<\/code> est utile pour le code de production, les simulations \u00e0 long terme o\u00f9 le red\u00e9marrage est peu pratique et la d\u00e9tection en temps r\u00e9el des goulots d'\u00e9tranglement.<\/p>\n<p>Les scientifiques l'aiment souvent parce qu'il ne n\u00e9cessite pas de modifications de code, ne red\u00e9marre pas le programme et a peu de frais g\u00e9n\u00e9raux.<\/p>\n<h3>Scalene : CPU, GPU et m\u00e9moire dans un seul outil<\/h3>\n<p><code>scalene<\/code> est un profileur haute performance qui mesure l'utilisation du processeur, l'utilisation du GPU et l'allocation de m\u00e9moire. Il produit des pannes ligne par ligne et peut aider \u00e0 identifier les fuites de m\u00e9moire.<\/p>\n<pre><code class=\"language-bash\">$ pip install scalene\n$ scalene my_solver.py\n<\/code><\/pre>\n<p><code>scalene<\/code> est utile pour les charges de travail acc\u00e9l\u00e9r\u00e9es par GPU, les simulations lourdes en m\u00e9moire et les cas o\u00f9 vous avez besoin d'une analyse CPU et de m\u00e9moire dans un seul outil.<\/p>\n<p>Cela compte parce que les goulots d'\u00e9tranglement en python scientifique ne sont pas toujours de purs probl\u00e8mes de CPU. Une op\u00e9ration de tableau dense peut passer plus de temps \u00e0 allouer des tableaux temporaires qu'\u00e0 effectuer des calculs.<\/p>\n<h3>Snakeviz : r\u00e9sultats visuels<\/h3>\n<p><code>cProfile<\/code> La sortie est bas\u00e9e sur le texte. <code>SnakeViz<\/code> convertit cette sortie en un graphique visuel interactif. Vous pouvez inspecter les appels de fonctions imbriqu\u00e9s, comparer le temps pass\u00e9 dans diff\u00e9rentes branches et identifier rapidement les puits de temps profonds.<\/p>\n<pre><code class=\"language-bash\">$ pip install snakeviz\n$ snakeviz fi_py_profile.prof\n<\/code><\/pre>\n<p><code>SnakeViz<\/code> est utile lorsque vous devez pr\u00e9senter des r\u00e9sultats de profilage \u00e0 des collaborateurs, comprendre les hi\u00e9rarchies d'appels ou trouver des mod\u00e8les difficiles \u00e0 lire dans la sortie du terminal.<\/p>\n<h3>line_profiler&nbsp;: d\u00e9tail ligne par ligne<\/h3>\n<p><code>line_profiler<\/code> donne des d\u00e9tails au niveau de la fonction au niveau de la ligne individuelle. Il est plus lent que <code>cProfile<\/code>, mais il montre exactement quelle ligne est ch\u00e8re.<\/p>\n<pre><code class=\"language-python\">from line_profiler import LineProfiler\n\nlp = LineProfiler()\nlp.add_function(my_heavy_function)\nlp.enable_by_count()\n\n# Run your code\nresult = equation.solve(var=phi)\nlp.print_stats()\n<\/code><\/pre>\n<p><code>line_profiler<\/code> est le meilleur pour une enqu\u00eate approfondie sur une fonction apr\u00e8s que vous sachiez d\u00e9j\u00e0 quelle partie du programme est lente.<\/p>\n<h2>Goulots d'\u00e9tranglement communs de solveurs PDE<\/h2>\n<p>Lorsque vous profilez des solveurs PDE bas\u00e9s sur Python tels que Fipy, Fenics ou des impl\u00e9mentations personnalis\u00e9es, plusieurs goulots d'\u00e9tranglement apparaissent souvent.<\/p>\n<h3>1. Frais g\u00e9n\u00e9raux d'assemblage de matrice<\/h3>\n<p>L'assemblage matriciel est l'une des surprises les plus courantes. De nombreux chercheurs s'attendent \u00e0 ce que le solveur lin\u00e9aire domine le temps d'ex\u00e9cution. Au lieu de cela, le code qui construit la matrice peut prendre plus de temps que la r\u00e9solution elle-m\u00eame.<\/p>\n<p>Dans FIPY, la phase <code>equation.prepare()<\/code> peut consommer une part importante du temps d'ex\u00e9cution avant la fin de <code>equation.solve()<\/code>. Si la phase de pr\u00e9paration domine, le goulot d'\u00e9tranglement peut \u00eatre dans la construction d'\u00e9quations au niveau de Python plut\u00f4t que dans le solveur num\u00e9rique.<\/p>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Op\u00e9rations par lots au lieu de boucler les variables de maillage en Python Pure.<\/li>\n<li>Utilisez des termes sources vectoris\u00e9es et \u00e9vitez les boucles Python.<\/li>\n<li>Consid\u00e9rez des \u00e9quations enti\u00e8rement implicites lorsque des termes sources explicites forcent de petits ajustements de pas de temps fr\u00e9quents.<\/li>\n<\/ul>\n<h3>2. Performance du solveur lin\u00e9aire<\/h3>\n<p>Lorsque l'assemblage matriciel n'est pas le probl\u00e8me principal, le solveur lin\u00e9aire peut l'\u00eatre. Les d\u00e9l\u00e9gu\u00e9s \u00e0 l'\u00e9tape <code>equation.solve()<\/code> travaillent dans un backend tel que <code>scipy.sparse.linalg<\/code>, Trilinos, PySparse ou PyAMG.<\/p>\n<p>Si vous passez \u00e0 une acc\u00e9l\u00e9ration GPU ou \u00e0 un autre backend, v\u00e9rifiez o\u00f9 se trouve la surcharge de s\u00e9rie. Un solveur peut sembler rapide isol\u00e9ment, mais perd toujours du temps lors de la construction de la matrice ou du transfert de donn\u00e9es.<\/p>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Testez diff\u00e9rents backends de solveur en fonction de l'\u00e9chelle du probl\u00e8me.<\/li>\n<li>Utilisez les pr\u00e9conditionneurs le cas \u00e9ch\u00e9ant.<\/li>\n<li>Comparez le temps total de construction et de r\u00e9solution, pas seulement le temps d'it\u00e9ration du solveur.<\/li>\n<\/ul>\n<h3>3. Mod\u00e8les d'allocation de m\u00e9moire<\/h3>\n<p>Le collecteur et l'allocateur de Python peuvent dominer le runtime si le code cr\u00e9e et rejette de mani\u00e8re r\u00e9p\u00e9t\u00e9e de grands tableaux. Ceci est courant dans les boucles de temps, les solveurs it\u00e9ratifs et les op\u00e9rations de maillage avec des structures de donn\u00e9es fragment\u00e9es.<\/p>\n<p>Les probl\u00e8mes d'allocation de m\u00e9moire apparaissent souvent dans :<\/p>\n<ul>\n<li>Solveurs it\u00e9ratifs avec vecteurs temporaires.<\/li>\n<li>Boucles de temps qui r\u00e9allouent des tableaux \u00e0 chaque \u00e9tape.<\/li>\n<li>Op\u00e9rations de maillage qui cr\u00e9ent des structures interm\u00e9diaires fragment\u00e9es.<\/li>\n<\/ul>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>Pr\u00e9-allouer des tableaux avant les boucles temporelles.<\/li>\n<li>Utilisez <code>tracemalloc<\/code> pour identifier les hotspots d'allocation.<\/li>\n<li>Utilisez <code>scalene<\/code> pour un profilage plus large de la m\u00e9moire.<\/li>\n<li>\u00c9vitez de cr\u00e9er de nouveaux tableaux dans les boucles internes lorsque des tampons r\u00e9utilisables sont possibles.<\/li>\n<\/ul>\n<h3>4. Au-dessus de la boucle de niveau Python<\/h3>\n<p>Python est rapide lorsque le travail est pouss\u00e9 dans des op\u00e9rations vectoris\u00e9es de NumPy. Il est lent lorsque vous bouclez sur des objets Python cellule par cellule. Si votre discr\u00e9tisation passe par des cellules en Python pur, vous risquez de perdre des performances significatives par rapport aux alternatives vectoris\u00e9es.<\/p>\n<pre><code class=\"language-python\"># Slow: Python-level loop\nfor cell in mesh.cells:\n    value[cell] = compute_stencil(cell)\n\n# Fast: Vectorized\nstencils = compute_stencils(mesh)\nvalues = apply_stencil(stencils)\n<\/code><\/pre>\n<p>Les strat\u00e9gies de correction possibles incluent :<\/p>\n<ul>\n<li>D\u00e9placez les boucles dans des extensions compil\u00e9es avec des outils tels que Cython ou Numba.<\/li>\n<li>Utilisez les op\u00e9rations vectoris\u00e9es de Fipy au lieu d'une it\u00e9ration au niveau Python.<\/li>\n<li>Profil d'abord, car parfois la boucle n'est pas le v\u00e9ritable goulot d'\u00e9tranglement.<\/li>\n<\/ul>\n<h3>5. Conversion d'E\/S et de donn\u00e9es<\/h3>\n<p>Les goulots d'\u00e9tranglement d'E\/S peuvent rester cach\u00e9s jusqu'\u00e0 ce que le flux de travail s'adapte. Si le code convertit des donn\u00e9es de maillage, \u00e9crit des r\u00e9sultats interm\u00e9diaires ou lit des fichiers de param\u00e8tres volumineux \u00e0 plusieurs reprises, les E\/S peuvent dominer l'ex\u00e9cution.<\/p>\n<pre><code class=\"language-python\"># This might look fast in isolation\nstart = time.time()\nimport numpy as np\ndata = np.load('large_mesh_data.npy')\nprint(f\"Loading took {time.time() - start:.3f}s\")  # Outputs: 0.001s\n\n# But if you do this inside a loop 1000 times: 1000x overhead\n<\/code><\/pre>\n<p>La cl\u00e9 est de profiler le flux de travail complet, pas seulement le noyau num\u00e9rique. Le chargement, la conversion et l'\u00e9criture r\u00e9p\u00e9t\u00e9s peuvent prendre plus de temps que pr\u00e9vu.<\/p>\n<h2>Un exemple de profilage pratique<\/h2>\n<p>Voici un moyen pratique de profiler une simulation FIPY.<\/p>\n<pre><code class=\"language-python\">import cProfile\nimport pstats\nimport fipy as fp\n\n# Create a simple diffusion problem\nnx = 100\ndx = 0.01\nmesh = fp.GridMesh(nx, dx)\nvar = fp.CellVariable(name=\"phi\", mesh=mesh)\n\n# Set up equation\nequation = fp.TransientDiffusionTerm(var)\n\n# Profile the solve\ncProfile.run('equation.solve(var=var, dt=0.001)', 'diffusion_profile.prof')\n\n# Analyze\nwith pstats.Stats('diffusion_profile.prof') as stats:\n    stats.sort_stats('cumulative')  # or 'time', 'ncalls', etc.\n    stats.print_stats(20)  # Top 20 functions\n<\/code><\/pre>\n<p>Ouvrez ensuite le profil dans <code>SnakeViz<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-bash\">$ snakeviz diffusion_profile.prof\n<\/code><\/pre>\n<p>Le rapport visuel peut afficher :<\/p>\n<ul>\n<li>Quelles branches de fonction prennent le plus de temps.<\/li>\n<li>Que le goulot d'\u00e9tranglement soit \u00e0 l'int\u00e9rieur <code>equation.solve()<\/code> ou dans l'\u00e9tape de pr\u00e9paration.<\/li>\n<li>Combien de temps est pass\u00e9 dans Numpy par rapport au code de niveau Python.<\/li>\n<\/ul>\n<p>Dans FIPY, l'\u00e9tape de pr\u00e9paration montre souvent qu'une grande partie du temps est consacr\u00e9e \u00e0 la construction de la matrice clairsem\u00e9e et \u00e0 l'application des conditions aux limites, et non dans la r\u00e9solution lin\u00e9aire elle-m\u00eame. C'est pourquoi l'optimisation du solveur peut manquer le v\u00e9ritable goulot d'\u00e9tranglement.<\/p>\n<h2>Profilage \u00e0 grande \u00e9chelle&nbsp;: lorsque votre simulation prend des heures<\/h2>\n<p>Le plus grand d\u00e9fi avec le profilage scientifique n'est pas toujours l'outil. C'est le temps d'ex\u00e9cution. Certaines simulations durent des heures et le profilage de la totalit\u00e9 de la simulation de production peut produire une \u00e9norme production.<\/p>\n<p>Les simulations longues n\u00e9cessitent une strat\u00e9gie de profilage plus minutieuse.<\/p>\n<h3>La solution de contournement&nbsp;: profiler un cas r\u00e9duit<\/h3>\n<ol>\n<li>R\u00e9duisez la r\u00e9solution du maillage ou le nombre de pas de temps.<\/li>\n<li>Ex\u00e9cutez le profileur sur ce petit cas.<\/li>\n<li>Recherchez des mod\u00e8les structurels dans lesquels les op\u00e9rations dominent proportionnellement.<\/li>\n<li>Extrapolez soigneusement, car les proportions peuvent \u00eatre valables m\u00eame lorsque les temps absolus changent.<\/li>\n<\/ol>\n<p>Il y a une mise en garde. Les petits cas peuvent cacher les goulots d'\u00e9tranglement qui n'apparaissent qu'\u00e0 plus grande \u00e9chelle. Ceux-ci peuvent inclure une surcharge de communication dans des solveurs parall\u00e8les, des erreurs de cache sur de grands r\u00e9seaux ou une pression de m\u00e9moire provenant de repr\u00e9sentations interm\u00e9diaires denses.<\/p>\n<h3>La solution de contournement&nbsp;: profiler une tranche repr\u00e9sentative<\/h3>\n<p>Si vous ex\u00e9cutez une simulation transitoire avec 10&nbsp;000 pas de temps, vous n'avez pas toujours besoin de profiler l'ensemble de l'ex\u00e9cution. A la place :<\/p>\n<ul>\n<li>Profilez uniquement les 100 premi\u00e8res \u00e9tapes.<\/li>\n<li>Ex\u00e9cutez suffisamment d'it\u00e9rations afin que les frais g\u00e9n\u00e9raux de profileur soient faibles par rapport au travail r\u00e9el.<\/li>\n<li>V\u00e9rifiez si la r\u00e9partition du temps reste coh\u00e9rente \u00e0 mesure que le nombre d'\u00e9tapes augmente.<\/li>\n<\/ul>\n<h2>Choisir le profileur adapt\u00e9 \u00e0 votre cas d'utilisation<\/h2>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Sc\u00e9nario<\/th>\n<th>Outil recommand\u00e9<\/th>\n<th>Pourquoi<\/th>\n<\/tr>\n<tr>\n<td>V\u00e9rification rapide, pas d'installation<\/td>\n<td><code>cProfile<\/code><\/td>\n<td>Int\u00e9gr\u00e9, z\u00e9ro installation, toujours disponible<\/td>\n<\/tr>\n<tr>\n<td>Code de production, ne peut pas red\u00e9marrer<\/td>\n<td><code>py-spy<\/code><\/td>\n<td>Peut s'attacher \u00e0 un processus en cours d'ex\u00e9cution avec une surcharge minimale<\/td>\n<\/tr>\n<tr>\n<td>Profilage du GPU, du CPU et de la m\u00e9moire<\/td>\n<td><code>scalene<\/code><\/td>\n<td>Tout-en-un, compatible avec le GPU, le profilage au niveau de la ligne<\/td>\n<\/tr>\n<tr>\n<td>Pr\u00e9sentation des r\u00e9sultats aux collaborateurs<\/td>\n<td><code>cProfile<\/code> + <code>SnakeViz<\/code><\/td>\n<td>Visuel, interactif et plus facile \u00e0 expliquer<\/td>\n<\/tr>\n<tr>\n<td>Plong\u00e9e profonde dans une seule fonction<\/td>\n<td><code>line_profiler<\/code><\/td>\n<td>D\u00e9tail ligne par ligne<\/td>\n<\/tr>\n<tr>\n<td>Mod\u00e8les d'allocation de m\u00e9moire<\/td>\n<td><code>scalene<\/code> ou <code>tracemalloc<\/code><\/td>\n<td>Suivi des allocations, des fuites et de la fragmentation<\/td>\n<\/tr>\n<tr>\n<td>Simulation de longue dur\u00e9e<\/td>\n<td><code>py-spy<\/code> Plus r\u00e9duit <code>cProfile<\/code><\/td>\n<td>Faible \u00e9chantillonnage des frais g\u00e9n\u00e9raux et repr\u00e9sentatif<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h2>Ce qu'il faut \u00e9viter&nbsp;: les erreurs de profilage courantes<\/h2>\n<p>Erreur 1 : Profilage d'un probl\u00e8me trop faible. Un maillage 10 \u00d7 10 qui se termine en moins d'une seconde ne r\u00e9v\u00e9lera pas les goulots d'\u00e9tranglement qui apparaissent \u00e0 l'\u00e9chelle de 1&nbsp;000&nbsp;\u00d7&nbsp;1&nbsp;000. profil \u00e0 une taille repr\u00e9sentative lorsque cela est possible.<\/p>\n<p>Erreur&nbsp;2&nbsp;: Optimisation avant le profilage. Si vous modifiez des solveurs, ajoutez du parall\u00e9lisme ou r\u00e9\u00e9crivez des boucles avant de collecter des donn\u00e9es de profil, vous devinez.<\/p>\n<p>Erreur 3 : Ignorer la phase de pr\u00e9paration. De nombreux chercheurs ne profilent que <code>equation.solve()<\/code>, mais la pr\u00e9paration peut prendre plus de temps que la solution. Profilez le pipeline complet.<\/p>\n<p>Erreur 4&nbsp;: Confondre le plus rapidement isol\u00e9 et le plus rapide dans l'ensemble. Un solveur avec moins d'it\u00e9rations peut encore \u00eatre plus lent s'il n\u00e9cessite un assemblage de matrice ou une conversion de donn\u00e9es co\u00fbteux.<\/p>\n<p>Erreur 5 : Profilage une seule fois. Profil Avant l'optimisation, effectuez une modification, puis \u00e0 nouveau profil. V\u00e9rifiez que le goulot d'\u00e9tranglement est r\u00e9ellement d\u00e9plac\u00e9 ou am\u00e9lior\u00e9.<\/p>\n<h2>R\u00e9f\u00e9rences internes<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Qu'est-ce que FIPY et quand devriez-vous l'utiliser&nbsp;?<\/a> - Comprendre l'architecture de Fipy et les op\u00e9rations vectoris\u00e9es.<\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Acc\u00e9l\u00e9ration GPU pour les simulations FIPY&nbsp;: cupy et numba Integration Guide<\/a> : consid\u00e9rations de performances pour les flux de travail acc\u00e9l\u00e9r\u00e9s par GPU.<\/li>\n<li><a href=\"https:\/\/matforge.org\/validation-and-verification-for-pde-simulations-practical-framework\/\">Validation et v\u00e9rification des simulations PDE&nbsp;: un cadre pratique<\/a> \u2014 s'assurer que les r\u00e9sultats du solveur sont corrects avant de les optimiser.<\/li>\n<\/ul>\n<h2>R\u00e9sum\u00e9&nbsp;: Le bon ordre est important<\/h2>\n<p>Le profilage des performances ne consiste pas \u00e0 trouver l'astuce la plus rapide. C'est une question de discipline.<\/p>\n<ol>\n<li>mesurer. Ex\u00e9cutez <code>cProfile<\/code>, <code>py-spy<\/code> ou <code>scalene<\/code> sur des tailles de probl\u00e8me repr\u00e9sentatives.<\/li>\n<li>Diagnostiquer. Lisez attentivement les r\u00e9sultats. La fonction top n'est pas toujours le v\u00e9ritable goulot d'\u00e9tranglement.<\/li>\n<li>traiter. Fixez ce que vous avez mesur\u00e9, pas ce que vous pensiez.<\/li>\n<li>mesurer \u00e0 nouveau. V\u00e9rifiez que votre correctif vous a r\u00e9ellement aid\u00e9.<\/li>\n<\/ol>\n<p>L'aper\u00e7u le plus pr\u00e9cieux du profilage est simple&nbsp;: la partie la plus lente de votre code est rarement la partie que vous pensiez lente. Une fois que vous avez des donn\u00e9es, l'optimisation cesse d'\u00eatre une hypoth\u00e8se et commence \u00e0 \u00eatre ing\u00e9nierie.<\/p>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/SOLVERS.html\">FIPY Performance Profiling and Solver Goulot d'\u00e9tranglement<\/a> \u2014 Documentation FIPY du NIST sur la s\u00e9lection des solveurs et les mod\u00e8les de performances.<\/li>\n<li><a href=\"https:\/\/aaltoscicomp.github.io\/python-for-scicomp\/profiling\/\">profilage du code Python<\/a> - Guide de mesure, de diagnostic et de traitement des probl\u00e8mes de performances de l'Universit\u00e9 Aalto.<\/li>\n<li><a href=\"https:\/\/edbennett.github.io\/high-performance-python\/05-profiling\/index.html\">Python haute performance&nbsp;: profilage pour identifier les goulots d'\u00e9tranglement<\/a> - Proc\u00e9dure pas \u00e0 pas de style atelier du d\u00e9but \u00e0 Tableau des flammes.<\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Points \u00e0 retenir cl\u00e9s profil avant d&rsquo;optimiser. Ne devinez pas quelle partie de votre solveur PDE est lente. Mesurez-le d&rsquo;abord. Le v\u00e9ritable goulot d&rsquo;\u00e9tranglement n&rsquo;est souvent pas celui que vous attendez. Les profileurs Python sont pratiques. Des outils tels que cProfile, py-spy, scalene et SnakeViz prennent chacun en charge des besoins de profilage diff\u00e9rents. Les [&hellip;]<\/p>\n","protected":false,"raw":""},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=388","iawp_total_views":2,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1250","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Profilage des performances des solveurs Python PDE<\/title>\n<meta name=\"description\" content=\"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d&#039;\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Profilage des performances des solveurs Python PDE\" \/>\n<meta property=\"og:description\" content=\"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d&#039;\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:30+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d&rsquo;\u00e9tranglement dans les solveurs PDE\",\"datePublished\":\"2026-08-21T14:28:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/\"},\"wordCount\":2856,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/\",\"name\":\"Profilage des performances des solveurs Python PDE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:30+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"description\":\"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d'\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/scientific-computing-performance-profiling-identifying-bottlenecks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d&#8217;\u00e9tranglement dans les solveurs PDE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"caption\":\"Elena Markovska\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/elena-markovska\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Profilage des performances des solveurs Python PDE","description":"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d'\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/","og_locale":"fr_FR","og_type":"article","og_title":"Profilage des performances des solveurs Python PDE","og_description":"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d'\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.","og_url":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:30+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Elena Markovska","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d&rsquo;\u00e9tranglement dans les solveurs PDE","datePublished":"2026-08-21T14:28:30+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/"},"wordCount":2856,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/","url":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/","name":"Profilage des performances des solveurs Python PDE","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:30+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"description":"Apprenez \u00e0 profiler les solveurs Python PDE, \u00e0 identifier les goulots d'\u00e9tranglement, \u00e0 comparer les outils de profilage et \u00e0 optimiser les flux de travail de calcul scientifique.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/scientific-computing-performance-profiling-identifying-bottlenecks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Profilage des performances du calcul scientifique\u00a0: identifier les goulots d&#8217;\u00e9tranglement dans les solveurs PDE"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","caption":"Elena Markovska"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/elena-markovska\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1250"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1250\/revisions"}],"predecessor-version":[{"id":1340,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1250\/revisions\/1340"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}