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.
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"))
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
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
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
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
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éférence: n guide pour analyser Python performance
Par exemple:
import timeit
def a():
return 1+1
print timeit.timeit(a, number=1000000)
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