Python Language
Profilierung
Suche…
%% Zeit und% Zeit in IPython
Profilierungs-Stringkonfiguration:
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
Profilierung von Schleifen über Iterables und Listen:
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
Funktion timeit ()
Profilwiederholung von Elementen in einem 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 Befehlszeile
Profilierung von Zahlen
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 der Befehlszeile
Der Quellcode mit der Direktive @profile vor der Funktion, für die Sie ein Profil erstellen möchten:
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()
Verwenden Sie den Befehl kernprof, um die Profilierung Zeile für Zeile zu berechnen
$ 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)])
Die Seitenanforderung ist fast immer langsamer als jede Berechnung, die auf den Informationen auf der Seite basiert.
CProfile (Preferred Profiler) verwenden
Python enthält einen Profiler namens cProfile. Dies wird im Allgemeinen der Verwendung der Zeit bevorzugt.
Es zerlegt Ihr gesamtes Skript und für jede Methode in Ihrem Skript sagt es Ihnen:
-
ncalls
:ncalls
an, wie oft eine Methode aufgerufen wurde -
tottime
: Gesamtzeit in der angegebenen Funktion (ohne Zeit in Aufrufen von Unterfunktionen) -
percall
: Zeit pro Anruf. Oder der Quotient von tottime geteilt durch ncalls -
cumtime
: Die kumulative Zeit in dieser und allen Unterfunktionen (vom Aufruf bis zum Beenden). Diese Zahl ist auch für rekursive Funktionen genau. -
percall
: ist der Quotient aus cumtime geteilt durch primitive Aufrufe -
filename:lineno(function)
die jeweiligen Daten jeder Funktion bereit
Der cProfiler kann einfach über die Befehlszeile aufgerufen werden:
$ python -m cProfile main.py
So sortieren Sie die zurückgegebene Liste der Profilmethoden nach der in der Methode benötigten Zeit:
$ python -m cProfile -s time main.py