Python Language
Profilage
Recherche…
%% timeit et% timeit dans IPython
Concaténation de chaîne de profilage:
In [1]: import string
In [2]: %%timeit s=""; long_list=list(string.ascii_letters)*50
....: for substring in long_list:
....: s+=substring
....:
1000 loops, best of 3: 570 us per loop
In [3]: %%timeit long_list=list(string.ascii_letters)*50
....: s="".join(long_list)
....:
100000 loops, best of 3: 16.1 us per loop
Boucles de profilage sur les itérables et les listes:
In [4]: %timeit for i in range(100000):pass
100 loops, best of 3: 2.82 ms per loop
In [5]: %timeit for i in list(range(100000)):pass
100 loops, best of 3: 3.95 ms per loop
fonction timeit ()
Répétition du profil d'éléments dans un tableau
>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576
ligne de commande timeit
Conciliation des nombres
python -m timeit "'-'.join(str(n) for n in range(100))"
10000 loops, best of 3: 29.2 usec per loop
python -m timeit "'-'.join(map(str,range(100)))"
100000 loops, best of 3: 19.4 usec per loop
line_profiler en ligne de commande
Le code source avec la directive @profile avant la fonction que nous voulons profiler:
import requests
@profile
def slow_func():
s = requests.session()
html=s.get("https://en.wikipedia.org/").text
sum([pow(ord(x),3.1) for x in list(html)])
for i in range(50):
slow_func()
Utilisation de la commande kernprof pour calculer ligne par ligne
$ kernprof -lv so6.py
Wrote profile results to so6.py.lprof
Timer unit: 4.27654e-07 s
Total time: 22.6427 s
File: so6.py
Function: slow_func at line 4
Line # Hits Time Per Hit % Time Line Contents
==============================================================
4 @profile
5 def slow_func():
6 50 20729 414.6 0.0 s = requests.session()
7 50 47618627 952372.5 89.9 html=s.get("https://en.wikipedia.org/").text
8 50 5306958 106139.2 10.0 sum([pow(ord(x),3.1) for x in list(html)])
La demande de page est presque toujours plus lente que tout calcul basé sur les informations de la page.
Utilisation de cProfile (Preferred Profiler)
Python inclut un profileur appelé cProfile. Ceci est généralement préférable à l'utilisation de timeit.
Il décompose tout votre script et pour chaque méthode dans votre script, il vous dit:
-
ncalls
: Le nombre de fois qu'une méthode a été appelée -
tottime
: Temps total passé dans la fonction donnée (hors temps passé dans les appels aux sous-fonctions) -
percall
: temps passé par appel. Ou le quotient de tottime divisé par les appels -
cumtime
: Le temps cumulé passé dans cette sous-fonction et toutes les sous-fonctions (de l'invocation à la sortie). Ce chiffre est précis même pour les fonctions récursives. -
percall
: est le quotient de cumtime divisé par des appels primitifs -
filename:lineno(function)
: fournit les données respectives de chaque fonction
Le cProfiler peut être facilement appelé sur la ligne de commande en utilisant:
$ python -m cProfile main.py
Pour trier la liste des méthodes profilées renvoyées en fonction du temps écoulé dans la méthode:
$ python -m cProfile -s time main.py