Python Language
Profilowy
Szukaj…
%% timeit i% timeit w IPython
Profilowanie łańcuchów łańcuchowych:
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
Profilowanie pętli w iteratach i listach:
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
funkcja timeit ()
Profilowanie powtórzeń elementów w tablicy
>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576
linia poleceń timeit
Profilowanie konkatanacji liczb
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 w linii poleceń
Kod źródłowy z dyrektywą @profile przed funkcją, którą chcemy profilować:
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()
Użycie polecenia kernprof do obliczenia profilowania linia po linii
$ 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)])
Żądanie strony jest prawie zawsze wolniejsze niż jakiekolwiek obliczenia oparte na informacjach na stronie.
Korzystanie z cProfile (Preferred Profiler)
Python zawiera profiler o nazwie cProfile. Jest to generalnie lepsze niż użycie timeit.
Rozkłada cały skrypt i dla każdej metody w skrypcie mówi:
-
ncalls
: liczbancalls
metody -
tottime
: Całkowity czas spędzony w danej funkcji (z wyłączeniem czasu wykonanego w wywołaniach podfunkcji) -
percall
: czas spędzony na połączeniu. Lub iloraz czasu pracy podzielonego przez ncalls -
cumtime
:cumtime
czas spędzony na tym i wszystkich podfunkcjach (od wywołania do wyjścia). Ta liczba jest dokładna nawet dla funkcji rekurencyjnych. -
percall
: iloraz cumtime podzielony przez prymitywne wywołania -
filename:lineno(function)
: zapewnia odpowiednie dane dla każdej funkcji
CProfiler można łatwo wywołać w wierszu poleceń, używając:
$ python -m cProfile main.py
Aby posortować zwróconą listę metod profilowanych według czasu zajętego w metodzie:
$ python -m cProfile -s time main.py
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow