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 


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow