Deși nu toate aplicațiile necesită o rapiditate foarte mare în procesarea datelor cu toții ne putem lovi sau ne-am lovit la un moment dat, în viața noastră de programator de nevoia unui cod cât mai rapid și eficient (optimizat) acest lucru este realizat prin teste de performanță (benchmarking).
Python ne oferă modulul cProfile, o extensie scrisă în C de către Brett Rosen și Ted Czotter bazată pe lsprof, ideal pentru testarea performanței aplicațiilor și disponibil încă de pe vremea Python 2.5!
Exemple teste de performanță (benchmarks):
Pentru a testa modul în care cProfile funcționează am scris acest mic script cu care voi face testele de performanță.
import cProfile import random import string def main(): oldlist = [] for x in range(120): oldlist.append(''.join(random.choice(string.ascii_lowercase) for i in range(10))) newlist = [] for word in oldlist: newlist.append(word.upper()) if __name__ == '__main__': cProfile.run('main()')
După finalizarea execuției scriptului vom primi un raport cu toate datele pe care cProfile le-a strâns.
8110 function calls in 0.009 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.009 0.009 :1() 1200 0.003 0.000 0.004 0.000 random.py:215(_randbelow) 1200 0.002 0.000 0.006 0.000 random.py:245(choice) 1 0.001 0.001 0.009 0.009 test.py:6(main) 1320 0.002 0.000 0.008 0.000 test.py:9() 1 0.000 0.000 0.009 0.009 {built-in method exec} 1200 0.000 0.000 0.000 0.000 {built-in method len} 240 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 1200 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1506 0.001 0.000 0.001 0.000 {method 'getrandbits' of '_random.Random' objects} 120 0.001 0.000 0.009 0.000 {method 'join' of 'str' objects} 120 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}
'ncalls' => de câte ori a fost apelată funcția 'tottime' => durata execuției funcției apelate, excluzând sub-funcțiile 'percall' => coeficientul dintre tottime / ncalls 'cummtime' => durata execuției tuturor funcțiilor inclusiv sub-funcțiilor de la execuție până la finalizare 'percall' => coeficientul dintre ncalls / nr. funcțiilor primitive apelate
Exemplu funcție primitivă (recursivă):
import cProfile import random import string import sys def main(number): if (int(number) == 5): sys.exit(1) i = 0 for i in range(10): if i > 5: main(5) else: i = i +1 if __name__ == '__main__': cProfile.run('main(0)')6 function calls (5 primitive calls) in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :1() 2/1 0.000 0.000 0.000 0.000 test.py:8(main) 1 0.000 0.000 0.000 0.000 {built-in method exec} 1 0.000 0.000 0.000 0.000 {built-in method exit} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
cProfile poate fi de asemenea invocat fără a fi introdus direct în script prin comanda:
python -m cProfile -o raport_script -s calls script.py
Tabel opțiuni sortare:
'calls' => număr apelări 'cumulative' => timp cumulat 'filename' => nume fișier 'nfl' => nume / fișier / linie 'stdname' => nume standard 'time' => timpul intern 'name' => nume funcție 'pcalls' => apelări primitive
Atenție pentru citirea rapoartelor salvate ca fișier este necesară folosirea modulului pstats. Pentru mai multe informații cu privire la modulul pstats vizitați următoarea pagină!
Citirea se face în felul următor:
import pstats p = pstats.Stats('fișier_raport') p.strip_dirs().sort_stats('calls').print_stats()
Alte module similare:
line_profiler – Robert Kern
memory_profiler – Fabian Pedregosa
Ambele module sunt disponibile in Python Package Index.
– pip install line_profiler
– pip install memory_profiler
Pentru întrebări sau nelămuriri vă aștept ca întotdeauna la secțiunea de comentarii a postării!