Principes de base du profilage Python

Qu'est-ce que le profilage?

Introduction d'outils

IPython et timeit

--Version étendue de l'interpréteur interactif python --Mesurez le temps d'exécution moyen en spécifiant le nombre de tests (-r) et le nombre de boucles (-n) avec le module timeit. --Il existe deux modèles: l'exécution directe de code court et l'importation et l'exécution de fichiers de code.

Installation

pip install ipython

Exemple de code

profiling.py


def fn_arr():
  for i in range(1000): arr.append(i)
def fn_ls():
  for i in range(1000): ls.append(i)

La mesure

Exécution de code unique

ipython


In [1]:from array import array
In [2]:arr = array('I', [])
In [3]:%timeit -r 10 -n 10 for i in range(1000): arr.insert(0, i)
10 loops, best of 10: 3.02 ms per loop
In [4]:%timeit -r 10 -n 10 for i in range(1000): ls.insert(0, i)
10 loops, best of 10: 3.8 ms per loop

Exécuter le fichier

ipython


In [1]: from profiling import fn_arr
In [2]: from profiling import fn_ls
In [3]: %timeit -r 10 -n 10 fn_arr()
10 loops, best of 10: 68.6 µs per loop
In [4]: %timeit -r 10 -n 10 fn_ls()
10 loops, best of 10: 8.92 µs per loop

Obtenez le temps d'exécution moyen par boucle lorsque 10 boucles sont exécutées 10 fois

cProfile

Exemple de code

profiling.py


def fn():
  l = []
  for _ in range(1000000):
    l.append('hoge')
    l.pop()
fn()

La mesure

Spécifiez le fichier et exécutez

python -m cProfile -s cumulative index.py 

         2000004 function calls in 23.897 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000   23.897   23.897 {built-in method exec}
        1    0.000    0.000   23.897   23.897 index.py:1(<module>)
        1   12.231   12.231   23.897   23.897 index.py:3(fn)
  1000000    5.833    0.000    5.833    0.000 {method 'append' of 'list' objects}
  1000000    5.832    0.000    5.832    0.000 {method 'pop' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Résultats de mesure de sortie

python -m cProfile -o profile.stats index.py

Lire et afficher le fichier des résultats de mesure

python
>>> import pstats
>>> p = pstats.Stats('profile.stats')
>>> p.sort_stats('cumulative')
<pstats.Stats object at 0x7f5cca3f0ef0>
>>> p.print_stats()
Sat Nov 28 06:58:28 2015    profile.stats

         2000004 function calls in 8.477 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    8.477    8.477 {built-in method exec}
        1    0.000    0.000    8.477    8.477 index.py:1(<module>)
        1    4.375    4.375    8.477    8.477 index.py:3(fn)
  1000000    2.088    0.000    2.088    0.000 {method 'pop' of 'list' objects}
  1000000    2.015    0.000    2.015    0.000 {method 'append' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


<pstats.Stats object at 0x7fadfcc20f28>

outre --print_callers () - Informations sur l'appelant --print_callees () --Information lorsqu'une fonction appelle une autre fonction Etc. peut être affiché

line_profiler

Installation

pip install line_profiler
git clone https://github.com/rkern/line_profiler.git

Exemple de code

profiling


@profile
def fn():
  l = []
  for _ in range(1000000):
    l.append('hoge')
    l.pop()
fn()

La mesure

> python line_profiler/kernprof.py -l -v index.py

Wrote profile results to index.py.lprof
Timer unit: 1e-06 s

Total time: 8.31965 s
File: index.py
Function: fn at line 2

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                             @profile
     3                                             def fn():
     4         1            6      6.0      0.0      l = []
     5   1000001      2641832      2.6     31.8      for _ in range(1000000):
     6   1000000      2806484      2.8     33.7        l.append('hoge')
     7   1000000      2871333      2.9     34.5        l.pop()

--Son --Nombre d'appels --Heure --Temps d'exécution --Par Hit - Une fois d'exécution -% Time - Temps de fonctionnement par ligne par rapport au temps de fonctionnement total

memory_profiler --Version mémoire de line_profiler

Installation

pip install memory_profile
pip install psutil

Exemple de code

Similaire à line_profiler

La mesure

> python -m memory_profiler index.py
Filename: index.py

Line #    Mem usage    Increment   Line Contents
================================================
     2   10.316 MiB    0.000 MiB     @profile
     3                               def fn():
     4   10.320 MiB    0.004 MiB       l = []
     5   10.320 MiB    0.000 MiB       for _ in range(1000000):
     6   10.320 MiB    0.000 MiB         l.append('hoge')
     7   10.320 MiB    0.000 MiB         l.pop()

Recommended Posts

Principes de base du profilage Python
Les bases de Python ⑤
Les bases de Python
Les bases de Python ④
Les bases de Python ③
Les bases de Python
Les bases de Python
Les bases de Python
Les bases de Python ③
Les bases de Python ②
Les bases de Python ②
bases de python: liste
Mémorandum de base Python
Profilage de script Python
Principes de base de Python CGI
bases de python: dictionnaire
Les bases de Python ①
Bases de python ①
bases de la tranche de python
# Principes de base de Python (portée)
Les bases de #Python (#Numpy 1/2)
Les bases de #Python (#Numpy 2/2)
# Bases de Python (fonctions)
Principes de base de Python #Numpy
bases de python: fonctions
Les bases de #Python (classe)
Résumé des bases de Python
Bases de Python ② pour déclaration
Python: apprentissage non supervisé: principes de base
Test numpy Python Basic 8
Errbot: les bases du chatbot Python
#Python DeepLearning Basics (Mathématiques 1/4)
Principes de base de Python: Socket, Dnspython
# 4 [python] Bases des fonctions
Bases de python: sortie
Python
bases de python: conditions et itérations
Paiza Python Primer 4: Notions de base sur les listes
Principes de base de Python x SIG (1)
Principes de base de Python x SIG (3)
Paiza Python Primer 5: Principes de base des dictionnaires
Bases de SNS Python faites avec Flask
Premiers pas avec Python Bases de Python
Revue des bases de Python (FizzBuzz)
Principes de base de Python x SIG (partie 2)
À propos de la liste de base des bases de Python
(python) Principes de base du chaînage de la bibliothèque d'apprentissage en profondeur
Apprenez les bases de Python ① Débutants élémentaires
python kafka
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Résumé Python
Python intégré
Notation d'inclusion Python
Technique Python
Bases statistiques et Python, graphisme, etc. (mémo)
Compte à rebours Python 2.7
Mémorandum Python
Python FlowFishMaster
Service Python
astuces python