Python Language
Perfilado
Buscar..
%% timeit y% timeit en IPython
Concatanación de cadenas de perfiles:
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
Perfilado de bucles sobre iterables y listas:
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
función timeit ()
Repetición de perfiles de elementos en una matriz.
>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576
línea de comandos de timeit
Perfil de concatanación de números.
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 en linea de comando
El código fuente con la directiva @profile antes de la función que queremos perfilar:
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()
Usando el comando kernprof para calcular el perfil línea por línea
$ 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)])
La solicitud de página es casi siempre más lenta que cualquier cálculo basado en la información de la página.
Usando cProfile (Perfilador preferido)
Python incluye un generador de perfiles llamado cProfile. Esto es generalmente preferido sobre el uso de timeit.
Desglosa su script completo y para cada método en su script le dice:
-
ncalls
: el número de veces que se llamó a un método -
tottime
: tiempo total empleado en la función dada (excluyendo el tiempo realizado en llamadas a subfunciones) -
percall
: Tiempo empleado por llamada. O el cociente de tottime dividido por ncalls -
cumtime
: el tiempo acumulado empleado en esta y todas las subfunciones (desde la invocación hasta la salida). Esta cifra es precisa incluso para funciones recursivas. -
percall
: es el cociente de cumtime dividido por llamadas primitivas -
filename:lineno(function)
: proporciona los datos respectivos de cada función
El cProfiler se puede llamar fácilmente en la línea de comandos usando:
$ python -m cProfile main.py
Para ordenar la lista devuelta de métodos perfilados por el tiempo empleado en el método:
$ python -m cProfile -s time main.py