SlideShare une entreprise Scribd logo
Prolage en Python
Bruno Goutorbe
Cdiscount
19 mai 2016
Prolage (proling)
Le prolage consiste à déterminer où mon code passe (perd ?)
du temps
De préférence sans avoir à se taper partout des
t0 = datetime . now ()
. . .
p r i n t ( datetime . now () − t0 )
L'objectif est de savoir où concentrer ses eorts pour
optimiser le code, avant de passer à la parallélisation
Bruno Goutorbe Prolage en Python
Cas d'usage
Pour illustrer la suite, on va se baser sur le script
similar_products.py, qui part d'une dataframe de produits :
# product_id price
0 product_0 700.10
1 product_1 500.55
. . .
et d'une matrice de similarité S :
Sij = similarité entre le produit i et le produit j
pour créer un chier qui associe à chaque produit une liste de
produit similaires (1) au moins aussi chers et (2) triés par
similarité décroissante :
product_id simproduct_ids
product_0 product_244
product_1 product_391 , product_175 , product_261
. . .
Bruno Goutorbe Prolage en Python
Temps d'exécution du code
Avec 100 produits : 2 s
Avec 500 produits : 15 s
Avec 1000 produits : 30 s
. . .
Estimation avec 2 millions de produits : environ 17 heures !
Un prolage s'impose
Bruno Goutorbe Prolage en Python
Proleur
On utilise de préférence cProfile pour proler un code Python :
soit directement dans l'interpréteur Python :
 import cProfile
 cProfile.run(2 + 2)
3 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 string :1(module )
1 0.000 0.000 0.000 0.000 {built -in method exec}
1 0.000 0.000 0.000 0.000 {method 'disable ' ...}
soit en ligne de commande :
 python −m c P r o f i l e s c r i p t . py
tottime = temps passé dans la fonction (sans compter les
fonctions qu'elle appelle)
cumtime = temps passé dans la fonction (en incluant les
fonctions qu'elle appelle)
Bruno Goutorbe Prolage en Python
Visualisation graphique : RunSnakeRun
Comme les résultats sont imbitables on les envoie dans un
chier et on se sert d'outils pour nous sortir de belles
représentations graphiques :
 python −m c P r o f i l e −o s c r i p t . prof s c r i p t . py
 runsnake s c r i p t . prof
ce qui donne des boites dont la taille représente le temps
passé :
Problème : RunSnakeRun n'est pas compatible avec Python 3
Bruno Goutorbe Prolage en Python
Visualisation graphique : SnakeViz
Pour installer SnakeViz sur Windows, un pip install snakeviz
fonctionne bien, ensuite :
 python −m c P r o f i l e −o similar_products . prof
similar_products . py
 snakeviz similar_products . prof
Et le miracle
s'accomplit :
Disque interne =
fonction racine
Un arc = une
fonction appelée
(par l'arc adjacent
interne)
Longueur d'arc =
temps passé
Bruno Goutorbe Prolage en Python
Granularité : de la fonction à la ligne
On a trouvé que le script passe la moitié de son temps dans la
fonction get_simproducts() et l'autre moitié dans
filter_and_sort_simproducts() 1
Mais on aimerait bien avoir une vision du temps passé ligne
par ligne dans ces fonctions
cProle agrège des statistiques par fonction ; pour passer à la
ligne il faut line_profiler.
Sur Windows un pip install line_profiler a peu de
chance de marcher. Mieux vaut télécharger la libraire
précompilée
2.
1. ok ce sont les deux seules fonctions. Mais bon, vous serez bien content de
pouvoir les identier lorsque votre programme contiendra 50 fonctions réparties
dans 15 modules.
2. ici : www.lfd.uci.edu/∼gohlke/pythonlibs/#line_proler
Bruno Goutorbe Prolage en Python
Prolage par ligne
Avant d'utiliser line_profiler il faut décorer les fonctions
que l'on souhaite proler avec un @profile au-dessus de la
fonction, par exemple :
@profile
def filter_and_sort_simproducts (...):
...
Ensuite on tape en ligne de commande
 kernprof -l -v similar_products.py
Bruno Goutorbe Prolage en Python
Prolage par ligne (suite)
Et ça donne :
Total time : 21.6487 s
F i l e : similar_products . py
Function : filter_and_sort_simproducts at l i n e 34
Line # Hits Time Per Hit % Time Line Contents
==============================================================
34 @ p r o f i l e
35 def filter_and_sort
36 
37 removes s i m i l a r
38 s o r t s them by
39 
40 500 5107 10.2 0.0 i f min_price :
41 500 6735587 13471.2 9.4 dfsimproduct
42 500 64969459 129938.9 90.6 dfsimproducts .
43 500 4408 8.8 0.0 return dfsimprod
On trouve que les lignes
dfsimproducts [ ' sim ' ] = s i m i l a r i t i e s
dfsimproducts . sort_values ( ' sim ' , ascending=False ,
i n p l a c e=True )
consomment 90% du temps.
Bruno Goutorbe Prolage en Python
Optimisation
Problème de la ligne
dfsimproducts . sort_values ( ' sim ' , ascending=False ,
i n p l a c e=True )
→ le tri sur place prend 10 fois plus de temps qu'un tri vers
une nouvelle dataframe !
Problème de la ligne
dfsimproducts [ ' sim ' ] = s i m i l a r i t i e s
→ l'opération ajouter une colonne force pandas à créer une
copie, alors que dfsimproducts n'était au départ qu'une vue
de dfproducts
Bruno Goutorbe Prolage en Python
Résumé
cProfile pour proler le code par fonction
SnakeViz pour visualiser les résultats
line_profiler pour proler le code par ligne
Un lien intéressant pour en savoir plus : nbviewer.jupyter.org
Bruno Goutorbe Prolage en Python

Contenu connexe

Tendances

Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018
salah fenni
 
Tuto crontab
Tuto crontabTuto crontab
Tuto crontab
Winslo Nwan
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018
salah fenni
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
cppfrug
 
Fonctions chaine
Fonctions chaineFonctions chaine
Fonctions chaineAfef Ilahi
 
TP C++ : Correction
TP C++ : CorrectionTP C++ : Correction
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)
salah fenni
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensions
wyggio
 
The iTronics Internet of things Workshop 27-05-2017 - get started
The iTronics Internet of things Workshop 27-05-2017 - get startedThe iTronics Internet of things Workshop 27-05-2017 - get started
The iTronics Internet of things Workshop 27-05-2017 - get started
Romaric Saounde Tsopnang
 
Les algorithmes avancés
Les algorithmes avancésLes algorithmes avancés
Les algorithmes avancésmohamed_SAYARI
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniShellmates
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
Geeks Anonymes
 
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
Romaric Saounde Tsopnang
 
La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en Python
ABDESSELAM ARROU
 
Programming language python 2021
Programming language python 2021Programming language python 2021
Programming language python 2021
Dalila Chouaya
 
12 quelques prédicats prédéfinis de swi
12  quelques prédicats prédéfinis de swi12  quelques prédicats prédéfinis de swi
12 quelques prédicats prédéfinis de swiSiham Rim Boudaoud
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivité
Sana Aroussi
 

Tendances (20)

Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018
 
Tuto crontab
Tuto crontabTuto crontab
Tuto crontab
 
Récursivité
RécursivitéRécursivité
Récursivité
 
Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018Corrige exercices pascal_fenni_2018
Corrige exercices pascal_fenni_2018
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Fonctions chaine
Fonctions chaineFonctions chaine
Fonctions chaine
 
TP C++ : Correction
TP C++ : CorrectionTP C++ : Correction
TP C++ : Correction
 
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensions
 
Algorithmes de tri
Algorithmes de triAlgorithmes de tri
Algorithmes de tri
 
The iTronics Internet of things Workshop 27-05-2017 - get started
The iTronics Internet of things Workshop 27-05-2017 - get startedThe iTronics Internet of things Workshop 27-05-2017 - get started
The iTronics Internet of things Workshop 27-05-2017 - get started
 
Les algorithmes avancés
Les algorithmes avancésLes algorithmes avancés
Les algorithmes avancés
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
2- The iTronics Internet of things Workshop 27-05-2017 - GPIO
 
La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en Python
 
Programmation Fonctionnelle
Programmation FonctionnelleProgrammation Fonctionnelle
Programmation Fonctionnelle
 
Programming language python 2021
Programming language python 2021Programming language python 2021
Programming language python 2021
 
12 quelques prédicats prédéfinis de swi
12  quelques prédicats prédéfinis de swi12  quelques prédicats prédéfinis de swi
12 quelques prédicats prédéfinis de swi
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivité
 

Similaire à Python profiling

Formation python
Formation pythonFormation python
Formation python
j_lipaz
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptx
LamissGhoul1
 
Mathématiques et Python
Mathématiques et PythonMathématiques et Python
Mathématiques et Python
Dany-Jack Mercier
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
Faycel Chaoua
 
livre-algorithmes.pdf
livre-algorithmes.pdflivre-algorithmes.pdf
livre-algorithmes.pdf
DurelDonfack
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
Microsoft
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
Tunisie collège
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
MICHRAFY MUSTAFA
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
WajihBaghdadi1
 
Formation python
Formation pythonFormation python
Formation python
Thierry Gayet
 
cours d'algorithmique et programmation 3sc final .pdf
cours d'algorithmique et programmation 3sc final .pdfcours d'algorithmique et programmation 3sc final .pdf
cours d'algorithmique et programmation 3sc final .pdf
LamissGhoul1
 
Cours de c
Cours de cCours de c
Cours de c
Nada Riahi
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Said Benaissa
 
Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2
hortis
 
Chapitre 5 Linux
Chapitre 5 LinuxChapitre 5 Linux
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
Thierry Leriche-Dessirier
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
tchappui
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
Microsoft
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 

Similaire à Python profiling (20)

Formation python
Formation pythonFormation python
Formation python
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptx
 
Mathématiques et Python
Mathématiques et PythonMathématiques et Python
Mathématiques et Python
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
livre-algorithmes.pdf
livre-algorithmes.pdflivre-algorithmes.pdf
livre-algorithmes.pdf
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
Formation python
Formation pythonFormation python
Formation python
 
Theme 7
Theme 7Theme 7
Theme 7
 
cours d'algorithmique et programmation 3sc final .pdf
cours d'algorithmique et programmation 3sc final .pdfcours d'algorithmique et programmation 3sc final .pdf
cours d'algorithmique et programmation 3sc final .pdf
 
Cours de c
Cours de cCours de c
Cours de c
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2Mardi gras du 2 juin 2010 : CSIM2
Mardi gras du 2 juin 2010 : CSIM2
 
Chapitre 5 Linux
Chapitre 5 LinuxChapitre 5 Linux
Chapitre 5 Linux
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 

Dernier

Estimations ELABE BFMTV ABSTENTION élections européennes 2024
Estimations ELABE BFMTV ABSTENTION élections européennes 2024Estimations ELABE BFMTV ABSTENTION élections européennes 2024
Estimations ELABE BFMTV ABSTENTION élections européennes 2024
contact Elabe
 
Deuxième actualisation estimation élections européennes 2024
Deuxième actualisation estimation élections européennes 2024Deuxième actualisation estimation élections européennes 2024
Deuxième actualisation estimation élections européennes 2024
contact Elabe
 
Actualisation estimation élections européennes 2024
Actualisation estimation élections européennes 2024Actualisation estimation élections européennes 2024
Actualisation estimation élections européennes 2024
contact Elabe
 
Webinaire_les aides aux investissements.pptx
Webinaire_les aides aux investissements.pptxWebinaire_les aides aux investissements.pptx
Webinaire_les aides aux investissements.pptx
Institut de l'Elevage - Idele
 
Les Français et les élections législatives
Les Français et les élections législativesLes Français et les élections législatives
Les Français et les élections législatives
contact Elabe
 
Les Français et les élections européennes - 9ème vague
Les Français et les élections européennes - 9ème vagueLes Français et les élections européennes - 9ème vague
Les Français et les élections européennes - 9ème vague
contact Elabe
 
L'Observatoire politique ELABE pour Les Echos - Juin 2024
L'Observatoire politique ELABE pour Les Echos - Juin 2024L'Observatoire politique ELABE pour Les Echos - Juin 2024
L'Observatoire politique ELABE pour Les Echos - Juin 2024
contact Elabe
 
Estimation élections européennes 2024 ELABE
Estimation élections européennes 2024 ELABEEstimation élections européennes 2024 ELABE
Estimation élections européennes 2024 ELABE
contact Elabe
 
Productivité et politique industrielles: deux défis à relever conjointement
Productivité et politique industrielles: deux défis à relever conjointementProductivité et politique industrielles: deux défis à relever conjointement
Productivité et politique industrielles: deux défis à relever conjointement
La Fabrique de l'industrie
 
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
contact Elabe
 
Comprendre le vote aux élections européennes du 9 juin 2024
Comprendre le vote aux élections européennes du 9 juin 2024Comprendre le vote aux élections européennes du 9 juin 2024
Comprendre le vote aux élections européennes du 9 juin 2024
contact Elabe
 
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
contact Elabe
 

Dernier (12)

Estimations ELABE BFMTV ABSTENTION élections européennes 2024
Estimations ELABE BFMTV ABSTENTION élections européennes 2024Estimations ELABE BFMTV ABSTENTION élections européennes 2024
Estimations ELABE BFMTV ABSTENTION élections européennes 2024
 
Deuxième actualisation estimation élections européennes 2024
Deuxième actualisation estimation élections européennes 2024Deuxième actualisation estimation élections européennes 2024
Deuxième actualisation estimation élections européennes 2024
 
Actualisation estimation élections européennes 2024
Actualisation estimation élections européennes 2024Actualisation estimation élections européennes 2024
Actualisation estimation élections européennes 2024
 
Webinaire_les aides aux investissements.pptx
Webinaire_les aides aux investissements.pptxWebinaire_les aides aux investissements.pptx
Webinaire_les aides aux investissements.pptx
 
Les Français et les élections législatives
Les Français et les élections législativesLes Français et les élections législatives
Les Français et les élections législatives
 
Les Français et les élections européennes - 9ème vague
Les Français et les élections européennes - 9ème vagueLes Français et les élections européennes - 9ème vague
Les Français et les élections européennes - 9ème vague
 
L'Observatoire politique ELABE pour Les Echos - Juin 2024
L'Observatoire politique ELABE pour Les Echos - Juin 2024L'Observatoire politique ELABE pour Les Echos - Juin 2024
L'Observatoire politique ELABE pour Les Echos - Juin 2024
 
Estimation élections européennes 2024 ELABE
Estimation élections européennes 2024 ELABEEstimation élections européennes 2024 ELABE
Estimation élections européennes 2024 ELABE
 
Productivité et politique industrielles: deux défis à relever conjointement
Productivité et politique industrielles: deux défis à relever conjointementProductivité et politique industrielles: deux défis à relever conjointement
Productivité et politique industrielles: deux défis à relever conjointement
 
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
Sondage ELABE pour Les Echos et l'Institut Montaigne -Les Français et la guer...
 
Comprendre le vote aux élections européennes du 9 juin 2024
Comprendre le vote aux élections européennes du 9 juin 2024Comprendre le vote aux élections européennes du 9 juin 2024
Comprendre le vote aux élections européennes du 9 juin 2024
 
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
Etat de l’opinion - Journée CCR CAT « Protégeons l’assurabilité »
 

Python profiling

  • 1. Prolage en Python Bruno Goutorbe Cdiscount 19 mai 2016
  • 2. Prolage (proling) Le prolage consiste à déterminer où mon code passe (perd ?) du temps De préférence sans avoir à se taper partout des t0 = datetime . now () . . . p r i n t ( datetime . now () − t0 ) L'objectif est de savoir où concentrer ses eorts pour optimiser le code, avant de passer à la parallélisation Bruno Goutorbe Prolage en Python
  • 3. Cas d'usage Pour illustrer la suite, on va se baser sur le script similar_products.py, qui part d'une dataframe de produits : # product_id price 0 product_0 700.10 1 product_1 500.55 . . . et d'une matrice de similarité S : Sij = similarité entre le produit i et le produit j pour créer un chier qui associe à chaque produit une liste de produit similaires (1) au moins aussi chers et (2) triés par similarité décroissante : product_id simproduct_ids product_0 product_244 product_1 product_391 , product_175 , product_261 . . . Bruno Goutorbe Prolage en Python
  • 4. Temps d'exécution du code Avec 100 produits : 2 s Avec 500 produits : 15 s Avec 1000 produits : 30 s . . . Estimation avec 2 millions de produits : environ 17 heures ! Un prolage s'impose Bruno Goutorbe Prolage en Python
  • 5. Proleur On utilise de préférence cProfile pour proler un code Python : soit directement dans l'interpréteur Python : import cProfile cProfile.run(2 + 2) 3 function calls in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 string :1(module ) 1 0.000 0.000 0.000 0.000 {built -in method exec} 1 0.000 0.000 0.000 0.000 {method 'disable ' ...} soit en ligne de commande : python −m c P r o f i l e s c r i p t . py tottime = temps passé dans la fonction (sans compter les fonctions qu'elle appelle) cumtime = temps passé dans la fonction (en incluant les fonctions qu'elle appelle) Bruno Goutorbe Prolage en Python
  • 6. Visualisation graphique : RunSnakeRun Comme les résultats sont imbitables on les envoie dans un chier et on se sert d'outils pour nous sortir de belles représentations graphiques : python −m c P r o f i l e −o s c r i p t . prof s c r i p t . py runsnake s c r i p t . prof ce qui donne des boites dont la taille représente le temps passé : Problème : RunSnakeRun n'est pas compatible avec Python 3 Bruno Goutorbe Prolage en Python
  • 7. Visualisation graphique : SnakeViz Pour installer SnakeViz sur Windows, un pip install snakeviz fonctionne bien, ensuite : python −m c P r o f i l e −o similar_products . prof similar_products . py snakeviz similar_products . prof Et le miracle s'accomplit : Disque interne = fonction racine Un arc = une fonction appelée (par l'arc adjacent interne) Longueur d'arc = temps passé Bruno Goutorbe Prolage en Python
  • 8. Granularité : de la fonction à la ligne On a trouvé que le script passe la moitié de son temps dans la fonction get_simproducts() et l'autre moitié dans filter_and_sort_simproducts() 1 Mais on aimerait bien avoir une vision du temps passé ligne par ligne dans ces fonctions cProle agrège des statistiques par fonction ; pour passer à la ligne il faut line_profiler. Sur Windows un pip install line_profiler a peu de chance de marcher. Mieux vaut télécharger la libraire précompilée 2. 1. ok ce sont les deux seules fonctions. Mais bon, vous serez bien content de pouvoir les identier lorsque votre programme contiendra 50 fonctions réparties dans 15 modules. 2. ici : www.lfd.uci.edu/∼gohlke/pythonlibs/#line_proler Bruno Goutorbe Prolage en Python
  • 9. Prolage par ligne Avant d'utiliser line_profiler il faut décorer les fonctions que l'on souhaite proler avec un @profile au-dessus de la fonction, par exemple : @profile def filter_and_sort_simproducts (...): ... Ensuite on tape en ligne de commande kernprof -l -v similar_products.py Bruno Goutorbe Prolage en Python
  • 10. Prolage par ligne (suite) Et ça donne : Total time : 21.6487 s F i l e : similar_products . py Function : filter_and_sort_simproducts at l i n e 34 Line # Hits Time Per Hit % Time Line Contents ============================================================== 34 @ p r o f i l e 35 def filter_and_sort 36 37 removes s i m i l a r 38 s o r t s them by 39 40 500 5107 10.2 0.0 i f min_price : 41 500 6735587 13471.2 9.4 dfsimproduct 42 500 64969459 129938.9 90.6 dfsimproducts . 43 500 4408 8.8 0.0 return dfsimprod On trouve que les lignes dfsimproducts [ ' sim ' ] = s i m i l a r i t i e s dfsimproducts . sort_values ( ' sim ' , ascending=False , i n p l a c e=True ) consomment 90% du temps. Bruno Goutorbe Prolage en Python
  • 11. Optimisation Problème de la ligne dfsimproducts . sort_values ( ' sim ' , ascending=False , i n p l a c e=True ) → le tri sur place prend 10 fois plus de temps qu'un tri vers une nouvelle dataframe ! Problème de la ligne dfsimproducts [ ' sim ' ] = s i m i l a r i t i e s → l'opération ajouter une colonne force pandas à créer une copie, alors que dfsimproducts n'était au départ qu'une vue de dfproducts Bruno Goutorbe Prolage en Python
  • 12. Résumé cProfile pour proler le code par fonction SnakeViz pour visualiser les résultats line_profiler pour proler le code par ligne Un lien intéressant pour en savoir plus : nbviewer.jupyter.org Bruno Goutorbe Prolage en Python