Ir al contenido principal

Medición de tiempo en Python

Buenas a todos, ayer me llegó un tweet en el que alguien necesitaba trabajar con conjuntos (sets) en PYTHON.

Esta persona se encontró con diversas opiniones sobre como era más correcto trabajar con los conjuntos, encontrándose con que la discusión derivó a mediciones tiempos y ordenes de eficiencia (como de lento es cada método).

Y aquí es donde me di cuenta que siempre elijo el mejor, pero no entro a cronometrar el algoritmo (en cuanto a las funciones a utilizar, si estás utilizando python3 deberías considerar esta entrada: https://jesusenlanet.blogspot.com/2018/08/python3-stop-measuring-time-with.html).

Así, he estado buscando las diferentes formas de medir tiempos, y me he encontrado con varias formas, diré cuales son y por que las descarto:

- Medir el tiempo "a mocho" dentro del código y ensuciándolo
Descartado radicalmente por ser poco elegante y propenso a que se meta la pata.

- Uso de hilos con thread.
Descartado debido a que según he leído, el modulo thread es opcional y dependiente de la plataforma, pudiendo tener que recompilar el interprete en algunas ocasiones.

Como puede que le de problemas de cabeza a alguien, descartado.

- Uso de un decorador : D
Si queremos que todo esto quede más bonito y elegante, y a la vez sea muy reutilizable, lo suyo es usar un decorador, te dejará el código tan bonito que hasta la SGAE lo considerará obra de arte.



USO DE DECORADORES EN MEDICIÓN DE TIEMPOS

Un decorador es una función D, que admite como parámetro una función F, y retorna una función R, que será la función F decorada por D.

R = D(F)

Y diréis, ¿esto que es lo que es?, ¿para que sirve?, ¿no estábamos programando?

Ejemplo con código:

def decorador(funcionF):
    def funcionR(*args):
        print "Se va a ejecutar %s" % f.__name__
        f(*args)
        print "Se ha ejecutado %s" % f.__name__
    return inner


// funcionQueQuieroDecorar es nuestra funcionF
// @decorador indica que funcionQueQuieroDecorar debe ser decorada con decorador
// A esta forma de usar los decoradores se le llama SAL SINTÁCTICA
// Así cuando llamemos a funcionQueQuieroDecorar en realidad se ejecutará el código de funcionR

@decorador
def funcionQueQuieroDecorar():
    print "Esta es la funcion que quiero decorar"

 
funcionQueQuieroDecorar()

Esto es un decorador muy simple, si queremos realizar ahora la medición de tiempos, el decorador debería de tener un aspecto tal que este:

import time

def decorador(funcionF):
    def funcionR(*arg):
        t1 = time.clock()
        res = funcionF(*arg)
        t2 = time.clock()
        print '%s tarda %0.5f ms' % (funcionF.__name__, (t2-t1)*1000.0)
        return res
    return funcionR
 
@decorador
def funcionF():
 print "Esta es la funcion que quiero decorar."

funcionF()

La idea es envolver la función que queremos ejecutar con las herramientas de medición mediante un decorador.

Se está usando el método clock() en vez de time() por cuestiones de arquitectura y precisión. En general parece ser que el método clock es más exacto que time, aunque dejo como práctica que jugueteéis con el decorador para refinarlo más.

Se podría hacer por ejemplo que se detectara la arquitectura y llamase al método más apropiado.

Actualización: Si utilizas python3 deberías considerar este artículo: https://jesusenlanet.blogspot.com/2018/08/python3-stop-measuring-time-with.html

Un saludo.

Comentarios

Entradas populares de este blog

Stop measuring time with time.clock() in Python3

If we read the time.clock() documentation ( https://docs.python.org/3/library/time.html#time.clock): Deprecated since version 3.3: The behaviour of this function depends on the platform: use perf_counter() or process_time() instead, depending on your requirements, to have a well defined behaviour. I use time.perf_counter, but feel free to use time.process_time if fits for your requirements. The main difference they have are: time.perf_counter() It does include time elapsed during sleep and is system-wide. time.process_time() It does not include time elapsed during sleep. It is process-wide by definition.

Polynomial regression using python

We are going to learn how to create a polynomial regression and make a prediction over a future value using python. The data set have been fetched from INE (national statistics institute) , that data is the EPA ( active population survey ), that tell us the national total (Spain), both genders. 16 and over are unemployed ( in thousands ). Example data: label serie rate 0 2002T1 0 2152.8 1 2002T2 1 2103.3 2 2002T3 2 2196.0 3 2002T4 3 2232.4 4 2003T1 4 2328.5 Data CSV can be downloaded here: https://drive.google.com/file/d/1fwvAZe7lah5DX8-DDEpmfeUDYQhKcfzG/view?usp=sharing Lets see how looks that data: Fine, as we can see the data describe a curve, so its for that because we want to use a polynomial regression. To try to approximate that curve we will use a grade 2 polynomial or...

Use django ORM standalone within your nameko micro-services

Learning about micro services with python, I found a great tool named nameko . https://www.nameko.io/ Nameko is a Python framework to build microservices that doesn't care in concrete technologies you will use within your project. To allow that microservices to work with a database, you can install into your project a wide variety of third parties, like SQLAlchemy (just like any other). To have an easy way to communicate with the database and keep track of the changes made to the models, I chose Django: I'm just learning about microservices and I want to keep focused on that. Easy to use, Django is a reliable web framework, have a powerful and well known ORM. Also using Django we will have many of the different functionalities that this framework provide. To make all this magic to work together, I developed a python package that allow you to use Django as a Nameko injected dependency: https://pypi.org/project/django-nameko-standalone/ You can found the source ...