Python | Cronometraje y perfilado del programa

Problemas: para encontrar dónde pasa el tiempo el programa y hacer mediciones de tiempo.

Para simplemente cronometrar todo el programa, por lo general es bastante fácil usar algo como el comando de tiempo de Unix como se muestra a continuación.

Código #1: Comando para cronometrar todo el programa

bash % time python3 someprogram.py
real 0m13.937s
user 0m12.162s
sys 0m0.098s
bash %

En el otro extremo, para tener un informe detallado que muestre lo que está haciendo el programa, se utiliza el módulo cProfile .

bash % python3 -m cProfile someprogram.py

Producción :

Ordered by: standard name
    ncalls tottime percall cumtime percall filename:lineno(function)
    263169 0.080 0.000 0.080 0.000 someprogram.py:16(frange)
    513 0.001 0.000 0.002 0.000 someprogram.py:30(generate_mandel)
    262656 0.194 0.000 15.295 0.000 someprogram.py:32()
    1 0.036 0.036 16.077 16.077 someprogram.py:4()
    262144 15.021 0.000 15.021 0.000 someprogram.py:4(in_mandelbrot)
    1 0.000 0.000 0.000 0.000 os.py:746(urandom)
    1 0.000 0.000 0.000 0.000 png.py:1056(_readable)
    1 0.000 0.000 0.000 0.000 png.py:1073(Reader)
    1 0.227 0.227 0.438 0.438 png.py:163()
    512 0.010 0.000 0.010 0.000 png.py:200(group)

La mayoría de las veces, la creación de perfiles del código se encuentra en algún lugar entre estos dos extremos. Por ejemplo, si uno ya sabe que el código pasa la mayor parte de su tiempo en unas pocas funciones seleccionadas. Para perfiles seleccionados de funciones, un decorador corto puede ser útil.
 
Código n.º 3: uso de un decorador corto para perfiles seleccionados de funciones

# abc.py
  
import time
from functools import wraps
  
def timethis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        r = func(*args, **kwargs)
        end = time.perf_counter()
        print('{}.{} : {}'.format(func.__module__, func.__name__, end - start))
        return r
    return wrapper

Para usar el decorador, simplemente colóquelo frente a una definición de función para obtener los tiempos como se muestra en el código a continuación.
Código #4:

@abc
def countdown(n):
    while n > 0:
    n -= 1
  
countdown(10000000)

Producción :

__main__.countdown : 0.803001880645752

Código #5: Definición de un administrador de contexto para cronometrar un bloque de declaraciones.

from contextlib import contextmanager
  
def timeblock(label):
    start = time.perf_counter()
    try:
        yield
    finally:
        end = time.perf_counter()
        print('{} : {}'.format(label, end - start))

Código #6: Cómo funciona el administrador de contexto

with timeblock('counting'):
    n = 10000000
    while n > 0:
        n -= 1

Producción :

counting : 1.5551159381866455

Código #7: Uso del módulo timeit para estudiar el rendimiento de pequeños fragmentos de código

from timeit import timeit
print (timeit('math.sqrt(2)', 'import math'), "\n")
  
print (timeit('sqrt(2)', 'from math import sqrt'))

Producción :

0.1432319980012835
0.10836604500218527

timeit funciona ejecutando la declaración especificada en el primer argumento un millón de veces y midiendo el tiempo.

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *