web-dev-qa-db-fra.com

Comment mesurer la vitesse d'une fonction python

J'écris habituellement des codes (fonctions) sur www.codefights.com en tant que concurrent. La vitesse est donc une partie importante du code. Comment puis-je mesurer la vitesse d'un certain code en langage python que ce soit la fonction lambda ou une fonction def.

10
Syed Hissaan

Jetez un œil au module timeit dans le libaray standard de pythons:

https://docs.python.org/2/library/timeit.html

>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.5858950614929199

Pour donner au module timeit l'accès aux fonctions que vous définissez, vous pouvez passer un paramètre de configuration qui contient une instruction d'importation:

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
10
Mandraenke

En 3 étapes;)

Étape 1: installez line_profiler

pip install line_profiler

Étape 2: Ajouter @profile à votre code:

from time import sleep

@profile
def so_slow(bar):
    sleep(5)
    return bar

if __name__ == "__main__":
    so_slow(5)

Étape 3: Testez votre code:

kernprof -l -v your_code.py

Résultat

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

Total time: 5.00283 s
File: your_code.py
Function: so_slow at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           @profile
     5                                           def so_slow(bar):
     6         1      5002830 5002830.0    100.0      sleep(5)
     7         1            2      2.0      0.0      return bar

memory_profiler

Vous pouvez utiliser memory_profiler aussi, installez-le, ajoutez un profil et appelez-le:

pip install memory_profiler
python -m memory_profiler your_code.py


Résultat:

Filename: your_code.py

Line #    Mem usage    Increment   Line Contents
================================================
     4   21.289 MiB    0.000 MiB   @profile
     5                             def so_slow(bar):
     6   21.289 MiB    0.000 MiB       sleep(5)
     7   21.289 MiB    0.000 MiB       return bar

Mettre à jour:

Vous pouvez utiliser objgraph pour trouver memory leak ou dessinez un graphique de votre code:

from time import sleep

import objgraph
x = [1]

objgraph.show_backrefs([x], filename='sample-backref-graph.png')

def so_slow(bar):
    sleep(5)
    return bar

if __name__ == "__main__":
    so_slow(5)


Résultat:

enter image description here

Référence: n guide pour analyser Python performance

6
RaminNietzsche

Par exemple:

import timeit

def a():
    return 1+1

print timeit.timeit(a, number=1000000)
2
Alexander Ejbekov

Vous pouvez l'utiliser en ipython et utiliser le% time pour voir le temps d'allocation nécessaire à l'exécution de la fonction:

In [1]: def function(a,b):
   ...:     return a+b
   ...: 

In [2]: %time function(1, 2)
CPU times: user 5 µs, sys: 0 ns, total: 5 µs
Wall time: 9.06 µs
Out[2]: 3
1
Chris PERE