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