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 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow