Python Language
Profiling
Zoeken…
%% timeit en% timeit in IPython
Profilering string concatanation:
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
Profilering van loops over iterables en lijsten:
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
timeit () functie
Profilering van herhaling van elementen in een array
>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576
timeit-opdrachtregel
Profilering van getallen
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 in opdrachtregel
De broncode met @profile-instructie vóór de functie die we willen profileren:
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()
Gebruik kernprof commando om profilering regel voor regel te berekenen
$ 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)])
Paginaverzoek is bijna altijd langzamer dan elke berekening op basis van de informatie op de pagina.
CProfile gebruiken (Preferred Profiler)
Python bevat een profiler genaamd cProfile. Dit heeft over het algemeen de voorkeur boven het gebruik van timeit.
Het splitst je hele script op en voor elke methode in je script vertelt het je:
-
ncalls
: het aantal keren dat een methode werd aangeroepen -
tottime
: totale tijd doorgebracht in de gegeven functie (exclusief de tijd die is gemaakt in oproepen naar subfuncties) -
percall
: tijd besteed per oproep. Of het quotiënt van tottime gedeeld door ncalls -
cumtime
: de cumulatieve tijd doorgebracht in deze en alle subfuncties (van aanroep tot exit). Dit cijfer is nauwkeurig, zelfs voor recursieve functies. -
percall
: is het quotiënt van cumtime gedeeld door primitieve aanroepen -
filename:lineno(function)
: geeft de respectieve gegevens van elke functie
De cProfiler kan eenvoudig op de opdrachtregel worden opgeroepen met:
$ python -m cProfile main.py
De geretourneerde lijst met geprofileerde methoden sorteren op de tijd die in de methode nodig is:
$ python -m cProfile -s time main.py