Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:1eval:tema02

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
clase:iabd:pia:1eval:tema02 [2023/10/23 20:13]
admin [Ejercicios]
clase:iabd:pia:1eval:tema02 [2025/03/12 14:36] (actual)
admin [Medición de rendimiento]
Línea 260: Línea 260:
  
  
-==== Estructuras de datos ====+===== Estructuras de datos =====
  
  
Línea 392: Línea 392:
  
 for key in a.keys(): for key in a.keys():
-    print(key)+    print(key,a[key])
 </sxh> </sxh>
  
 <sxh base> <sxh base>
-nombre +nombre Juan 
-edad+edad 37 
 +</sxh> 
 + 
 +  * Recorrer obteniendo clave y valor 
 +<sxh python> 
 +for key, value in a.items(): 
 +    print(key,value)
 </sxh> </sxh>
  
Línea 407: Línea 413:
 from tabulate import tabulate from tabulate import tabulate
  
-a=[  [5,0.7,0.765], [10,1.45,0.84], [20,2.678,0.978], [60,11.396,0.9973]  ]+datos=[  [5,0.7,0.765], [10,1.45,0.84], [20,2.678,0.978], [60,11.396,0.9973]  ]
  
  
-print(tabulate(a, headers=["Épocas", "Tiempo (s)", "Resultado"]))+print(tabulate(datos, headers=["Épocas", "Tiempo (s)", "Resultado"]))
 </sxh> </sxh>
  
Línea 422: Línea 428:
 </sxh> </sxh>
  
 +También podemos añadir una primera columna que sean también como "cabeceras". El siguiente anterior ejemplo se podría modificar de forma que en el array ''a'' solo estén los datos de tiempo y resultado y no las épocas ya que son como "cabeceras".
  
 +<sxh python>
 +from tabulate import tabulate
 +
 +datos=[  [0.7,0.765], [1.45,0.84], [2.678,0.978], [11.396,0.9973]  ]
 +epocas=[5,10,20,60]
 +
 +print(tabulate(datos, headers=["Épocas", "Tiempo (s)", "Resultado"],showindex=epocas))
 +
 +</sxh>
 +<sxh base>
 +  Épocas    Tiempo (s)    Resultado
 +--------  ------------  -----------
 +               0.7         0.765
 +      10         1.45        0.84
 +      20         2.678       0.978
 +      60        11.396       0.9973
 +</sxh>
  
-==== Estructuras de control ====+===== Estructuras de control =====
  
   * Condicional   * Condicional
Línea 500: Línea 524:
 </sxh> </sxh>
  
-==== Funciones ====+===== Funciones =====
  
   * Función que retorna un valor   * Función que retorna un valor
Línea 591: Línea 615:
 </sxh> </sxh>
  
-==== Medición de rendimiento ==== 
- 
-=== timeit === 
-IPython es como la forma genérica de los Jupyter Notebooks. Y tiene una serie de órdenes que podemos usar directamente. La orden ''%timeit'' permite saber el tiempo que ha tardado una orden en ejecutarse.  
  
 +===== Clases =====
 +Para crear clases en python:
 +  * ''class'': Se crear la clase
 +  * ''self'': Para referirse a propiedades y métodos del propio objeto, se pasa siempre como primer argumento en todos los métodos.
 +  * ''%%__%%init%%__%%'': El nombre del constructor
 + 
  
 +  * Vamos a crear la clase rectángulo
 <sxh python> <sxh python>
-time %timeit -n1 -r1 -o sum(range(10000000))+class Rectangulo: 
 +    def __init__(self, longitud, ancho): 
 +        self.longitud longitud 
 +        self.ancho = ancho 
 + 
 +    def calcular_area(self): 
 +        return self.longitud * self.ancho 
 + 
 +    def calcular_perimetro(self)
 +        return 2 * (self.longitud + self.ancho)
 </sxh> </sxh>
-Lo que hace es calcula el tiempo de ejecutar la orden ''sum(range(1000000000))'' y almacena cuanto ha tardado en ''time'' 
  
-Y para imprimirlo, se usa:+ 
 +  * Ahora vamos a usar la clase que hemos creado
 <sxh python> <sxh python>
-print(round(time.average,2),"seg")+mi_rectangulo = Rectangulo(5, 10) 
 + 
 +print("Longitud:", mi_rectangulo.longitud) 
 +print("Ancho:"mi_rectangulo.ancho) 
 +print("Área:"mi_rectangulo.calcular_area()) 
 +print("Perímetro:", mi_rectangulo.calcular_perimetro()
 </sxh> </sxh>
  
 <sxh base> <sxh base>
-0.21 seg+Longitud: 5 
 +Ancho: 10 
 +Área: 50 
 +Perímetro: 30
 </sxh> </sxh>
- +===== Medición de rendimiento ===== 
-Sin embargo el problema de usar ''%timeit'' es que lo que ejecutas no puede devolver un resultado. Es decir que no podríamos saber el resultado de la suma. +Para medir el tiempo que ha tardado algo se usa el método ''perf_counter''.
- +
-=== perf_counter === +
-Para solucionar el problema anterior podemos simplemente medir nosotros el tiempo que tarda un método en ejecutarse con la función ''perf_counter''.+
  
 <sxh python> <sxh python>
-from time import perf_counter+from time import monotonic
  
-t = perf_counter()+t = monotonic()
 resultado=sum(range(10000000)) resultado=sum(range(10000000))
-t=perf_counter()-t+t=monotonic()-t
  
 print(resultado) print(resultado)
Línea 633: Línea 674:
  
 El resultado se muestra en segundos El resultado se muestra en segundos
 +
 +<note tip>
 +El problema de ''perf_counter()'' es que cuenta el tiempo en el que el ordenador está suspendido mientras que ''monotonic()'' no lo hace. Y tampoco cuenta el tiempo que el proceso está suspendido.
 +</note>
  
 Mas información: Mas información:
 +  * [[https://luminousmen.com/post/how-to-not-leap-in-time-using-python/|How to not leap in time using Python]]
   * [[https://morton-kuo.medium.com/ml09-e549b2c26c47|ML09: Measuring Running Time in Python & R]]   * [[https://morton-kuo.medium.com/ml09-e549b2c26c47|ML09: Measuring Running Time in Python & R]]
 +
 +===== Poetry =====
 +A veces no quieremos usar conda sino tener una carpeta con todo lo que necesita el proyecto, al estilo de //NodeJS//. En ese caso podemos usar una herramienta llamada [[https://python-poetry.org/|Poetry]]
 +
 +  * Instalar poetry
 +<sxh bash>
 +pip install --user poetry
 +
 +</sxh>
 +
 +
 +  * Comprobar que tenemos poetry instalado
 +
 +<sxh bash>
 +poetry --version
 +
 +</sxh>
 +
 +  * Para decir que las librerías se instalen en nuestra propia carpeta del proyecto.
 +<sxh bash>
 +poetry config virtualenvs.in-project true
 +
 +</sxh>
 +
 +  * Para tener un proyecto con python y todas sus dependencias en la misma carpeta haremos lo siguiente:
 +<sxh bash>
 +poetry init
 +poetry add libclang = "<12.0.0" numpy pandas matplotlib seaborn scikit-learn tensorflow tabulate PyMySQL SQLAlchemy ipympl keras-tuner tensorflow-addons statsmodels
 +poetry install
 +</sxh>
 +
 +<note important>
 +Si al hacer el ''poetry add'' se produce el error:
 +''[org.freedesktop.DBus.Error.UnknownObject] ("No such object path '/org/freedesktop/secrets/aliases/default'",)'' 
 +deberemos crear la siguiente variable de entorno:
 +''export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring''
 +</note>
 +
 +Para ejecutar el código hay 2 formas:
 +
 +  * Desde la línea de comandos:
 +<sxh python>
 +poetry run python my_script.py
 +</sxh>
 +
 +  * Desde VS Code seleccionar en los entornos de ejecución la carpeta ''.venv'' del propio proyecto:
 +{{ :clase:iabd:pia:1eval:vs-code-poetry.png?direct |}}
 +
 +  * Si queremos usar el entorno de poetry pero no está en nuestra carpeta se puede indicar a VS Code cual es el ejecutable de python que debe usar siempre para ello hay que crear en la carpeta de nuestro proyecto el fichero ''$HOME/.config/Code/User/settings.json''
 +
 +<sxh base>
 +{    
 +    "python.defaultInterpreterPath": "/home/logongas/python_default_env/.venv/bin/python",
 +}
 +</sxh>
 +
 +
  
 ===== Ejercicios ===== ===== Ejercicios =====
Línea 917: Línea 1020:
 |  64, 128, 64, 8, 1  |  20 | |  64, 128, 64, 8, 1  |  20 |
 |  64, 128, 64, 8, 1  |  40 | |  64, 128, 64, 8, 1  |  40 |
 +
 +==== Ejercicio 20 ====
 +Crea una clase llamada ''CuentaBancaria''.
 +
 +La clase debe tener  los siguientes atributos:
 +
 +  * ''titular'': el titular de la cuenta.
 +  * ''saldo'': el saldo actual de la cuenta.
 +  * 
 +La clase debe tener los siguientes métodos:
 +  * ''%%__%%init%%__%%'': el método de inicialización que toma el titular como parámetro e inicializa el saldo en 0.
 +  * ''depositar'': un método que toma una cantidad como parámetro y la suma al saldo actual.
 +  * ''retirar'': un método que toma una cantidad como parámetro y la resta del saldo actual, pero verifica que haya suficiente saldo antes de realizar la operación.
 +  * ''obtener_saldo'': un método que devuelve el saldo actual de la cuenta.
 +
 +Usa la clase de forma que
 +  * Se cree un objeto
 +  * Se depositen 100€
 +  * Se retiren 75€.
 +  * Imprimas el titular y el saldo.
  
  
clase/iabd/pia/1eval/tema02.1698084793.txt.gz · Última modificación: 2023/10/23 20:13 por admin