web-dev-qa-db-fra.com

Profilage d'un programme python avec PyCharm (ou tout autre IDE)

J'utilise un programme python relativement complexe et il contient une simulation montecarlo qui prend la plupart du temps. J'aimerais savoir quelle partie de celui-ci utilise le plus de ressources, donc je peut potentiellement le rendre plus rapide.

J'utilise l'édition PyCharm Professional et j'ai essayé d'utiliser le profileur, mais le résultat n'est qu'une grande liste de fonctions non pertinentes dont je n'ai jamais entendu parler.

Questions: Existe-t-il un bon profileur que je peux utiliser et qui donne des résultats significatifs afin que je puisse voir quelle fonction ou mot-clé utilise le plus de ressources dans ma simulation montecarlo?

17
Nickpick

En fonction de vos besoins et de votre version python, vous souhaiterez peut-être utiliser quelque chose comme hotshot. https://docs.python.org/2/library/hotshot.html =

ÉDITER:

Pour python 3.4 cProfile est probablement l'une des meilleures options disponibles, mais vous devrez certainement filtrer les résultats avec grep/sed/awk pour pouvoir obtenir les résultats pertinents, surtout si vous utilisez des bibliothèques importé là où il y a beaucoup d'appels internes.

J'aime trier par nombre d'appels: python -m cProfile -s 'calls' <your_program>.py

Maintenant, le problème en python3 avec cette méthode est le nombre d'appels primitifs qui s'afficheront si cProfile est appelé en externe, donc l'exécuter en interne est probablement une meilleure idée:

import cProfile

pr = cProfile.Profile()
pr.enable()
your_function_call()
pr.disable()
# after your program ends
pr.print_stats(sort="calls")
12
shafeen

Remarque: Comme mentionné dans les commentaires, ce qui suit s'applique à la version payante de PyCharm:

Si vous utilisez 3.x (je ne sais pas pour 2.x), je vais ajouter à la réponse de shafeen et le rendre plus spécifique à PyCharm selon le post original. Cela fonctionne également mieux pour les applications Web ou les applications plus volumineuses que les programmes de ligne de commande simples où l'impression de la sortie sur stdout peut être correcte (il est préférable de pouvoir trier différentes manières via la visionneuse de PyCharm).

En effet, faites comme suggéré en instanciant Profile et en activant et désactivant au besoin. Pour que cela soit utile, vous devrez l'enregistrer dans un fichier.

  • Dans une section externe de votre code, instanciez Profile.
  • Dans la section intérieure de votre code, faites votre profilage.
  • Maintenant, appelez pr.dump_stats ('profile.pstat')

Vous avez maintenant un fichier de profil que vous souhaitez examiner. Accédez à Outils | Ouvrir l'instantané de CProfile. Sélectionnez profile.pstat et maintenant vous pouvez afficher et trier par différents titres comme vous le souhaitez.

Sommaire

import cProfile as profile

# In outer section of code
pr = profile.Profile()
pr.disable()

# In section you want to profile
pr.enable()
# code of interest
pr.disable()

# Back in outer section of code
pr.dump_stats('profile.pstat')

Ouvrez le fichier dans la visionneuse CProfile de PyCharm.

10
Outfast Source