Así que hablemos de algunas de las aplicaciones prácticas de los decoradores, quiero decir, ya las hemos visto en
clases, ¿no?
Vimos cómo el método de clase y el método estático pudieron crear métodos de clase y métodos estáticos en la clase
que la clase directa puede usar.
Y si no los recuerda, simplemente vuelva a esos videos.
Pero quiero mostrarte uno de mis ejemplos favoritos de decorador, vamos a crear el nuestro.
Lo que vamos a hacer es tener una actuación.
Decorator y por cierto, este decorador no existe en Python, lo vamos a construir desde cero.
Lo que quiero hacer es poder tener un decorador de rendimiento que pueda usar durante la prueba de mi código para ver qué tan
rápido se ejecuta mi código.
Por ejemplo, si tuviera una función, digamos que lleva mucho tiempo.
Bueno, mucho tiempo para completar, así que voy a hacer un bucle muy largo y diré que estoy en el rango de
digamos.
Todos estos números, y solo voy a hacer un cálculo aleatorio, multiplicado por cinco.
Esta función, quiero saber qué tan bien funciona, cuántos milisegundos se necesitan para completar esto, entonces, ¿cómo
podemos construir eso?
Primero, voy a hacer algo de lo que no hemos hablado todavía, que haremos
algo sobre módulos en módulos integrados, así que por ahora, no vamos a hablar
demasiado de esto, pero vamos para importar desde el módulo de tiempo algo llamado tiempo doble.
Nuevamente, algo de lo que hablaremos en la sección de módulos del curso, esencialmente digo,
oye, cuando instalé Python o en mi caso cuando estoy usando este Reppel, tiene acceso a este tiempo si pregunté
para ello.
Y en este caso, digo, oye, quiero usar este objeto o módulo de tiempo que obtengo de Python.
Y aquí vamos a crear nuestro decorador siguiendo el patrón que hemos aprendido.
Voy a decir que definir rendimiento y rendimiento aceptará una función como la que hemos visto antes.
Y aquí tendremos nuestro envoltorio.
Así que digamos función contenedora y función contenedora.
Si recuerda, será flexible al incluir arcos de estrellas y arcos de palabras clave de estrellas de estrellas.
Para que podamos pasarle la cantidad de parámetros que queramos, porque no sabemos cómo funciona esta función, cuántos parámetros
va a tener y quiero poder usar el rendimiento en todas mis funciones.
Ahora, aquí primero, lo que vamos a hacer es obtener el resultado de la función.
Ser el.
Función que recibimos aquí mismo y luego simplemente decimos.
Ejecute la función con arcos de palabras clave de estrella y estrella estrella.
Y finalmente, al final de esto, quiero devolver los resultados.
Y luego, finalmente, vamos a devolver al rapero, así que nada que no hayamos visto antes, podría haber hecho regresar aquí o
simplemente ejecutar la función, pero les mostraré por qué lo hice de esta manera en un segundo. .
En este momento, nuestra función realmente no hace nada.
Si hago clic, corre.
Bueno, no pasa nada si lo hago durante mucho tiempo y ejecuto esta función.
Simplemente tardó mucho en ejecutarse, pero eso es todo, no pasa nada.
Aquí es cuando hacemos las cosas interesantes.
Queremos calcular desde el comienzo de la ejecución de esta función hasta el final de la ejecución de esta función.
Y podemos usar el módulo de tiempo para hacer esto.
Puedo crear una línea de tiempo variable para el inicio y simplemente decir la hora.
Así que estoy ejecutando esta función de tiempo que va a comenzar.
Una vez y di, oye, esta primera vez va a ser una.
Y después de esta función, nuestra función principal, se ejecuta mucho tiempo, voy a decir T dos y decir, oye,
¿qué hora es?
Ahora.
Así que esta vez vamos a comprobar qué hora es ahora y luego vamos a ejecutar esta función y luego esta
vez vamos a comprobar la hora y la diferencia que hay entre estos dos es cuánto tiempo
tomó esta parte.
Derecha.
Entonces, todo lo que hacemos es decir imprimir una cadena F y decir que T tomó uno menos T para.
Correcto, y esto en realidad devuelve un milisegundo, así que solo diré que se arma cuatro milisegundos.
Y eso es.
Envolví mi función con solo esta pieza de tiempo adicional, y luego estoy imprimiendo tan pronto como ejecutamos la función,
cuánto tiempo tomó.
Así que echémosle un vistazo.
Si ahora ejecuto mi función de larga duración aquí mismo y hago clic en ejecutar.
Muy bien, obtengo un número negativo porque me equivoqué aquí.
Esto debería ser T dos menos T uno, porque el tiempo en T uno pasa un tiempo y luego dos.
Entonces, dos siempre será más grande que T uno si ejecuto esto.
Muy bien, tomó el punto uno, seis milisegundos, creo que en realidad son segundos.
Ahora, hagamos esta función larga aún más si hago esto y hago clic en ejecutar.
Vaya, eso tomó un punto nueve segundos.
¿Qué pasa si lo hago aún más largo, si hago clic en ejecutar y esta es la parte en la que sigo hablando hasta que se ejecuta
la función, porque va a haber un silencio incómodo, de lo contrario, espero que esto termine pronto porque no
tengo nada más de qué hablar?
Vamos, esto se está poniendo incómodo.
Está bien.
Vamos.
Oh chico.
Voy a avanzar rápido por aquí.
Vaya, tomó 19 segundos.
Eso es bastante malo.
Pero ahora tengo este decorador que puedo darle a casi cualquier función en mi programa y realmente medir el rendimiento
de mi función bastante útil, ¿verdad?
Podría tener este código.
Y antes de que digamos que implemento mi código o publico mi código en el mundo, puedo probar el rendimiento de mis funciones
y tal vez pueda optimizar las cosas de diferentes maneras.
Muy, muy útil.
Y lo hice en solo unas pocas líneas de código.
Nueve líneas de código.
Ahora, fíjate, este decorador de rendimiento depende de la máquina y de la velocidad de tu CPU y memoria en
tu computadora.
Entonces, lo que me tomó 19 segundos podría llevarle mucho más o mucho menos dependiendo de su máquina.
Pero esta es una buena forma de comparar funciones relativamente.
Así que espero que después de esto, vea que el poder de los decoradores de decoradores se usa mucho en las bibliotecas y marcos
de Python.
Los frameworks web de los que vamos a hablar, como Django y flask usan decoradores,
tal vez quieras tener algún decorador de autenticación, así que te autenticas donde solo se puede ejecutar cada función.
Si el usuario está autenticado.
Tal vez tengan el privilegio de ejecutar una función como iniciar sesión en un sitio web.
O tal vez solo necesite un registro o un registro.
Decorador que solo registra y le permite a su base de datos saber que, oye, alguien ha iniciado sesión en su sistema
o, oye, alguien ha comprado algo en Amazon.
O bien, alguien acaba de solicitar una solicitud de amistad, hay tantos usos para decoradores y decorador es un
tema difícil.
No los verá en todo el código Python.
Son solo una característica adicional que puede usar a medida que se sienta cada vez más cómodo con Python.
Pero espero que al final de esta sala, los entiendas menos para tal vez algún día construir los
tuyos propios o usar los prediseñados por bibliotecas y marcos.
Te veo en el proximo.
Adiós.