Tenemos por ejemplo la función:
Código Python:
Ver original
def fibonacci(n): if n < 3: return 1 else: return fibonacci(n-2) + fibonacci(n-1)
Que calcula el número de fibonacci.
Para controlar el tiempo de ejecución bastaria con importar el módulo time y hacer un registro antes y otro después de su ejecución y calcular la diferencia.
Código Python:
Ver original
import time def func_time(): ti = time.time() fibonacci(20) tf = time.time() print tf-ti func_time()
Código:
Para hacer esto más práctico podemos hacer un decorador.0.00212001800537
Un decorador es una función que recibe como parámetro otra función y devuelve el resultado de ésta modificado( decorado).
Código Python:
Ver original
def timeit(func): def timed(*args, **kw): ti = time.time() result = func(*args, **kw) tf = time.time() print('Time:{:.10f} sec'.format(tf-ti)) return result return timed
Y lo aplicamos de esta forma:
Código Python:
Ver original
@timeit def prueba(): return fibonacci(10) print prueba()
o bien:
Código Python:
Ver original
@timeit def main(n): def fibonacci(n): if n < 3: return 1 else: return fibonacci(n-2) + fibonacci(n-1) print main(20)
En este caso al ser una función recursiva no podemos aplicar el decorador directamente a la función ya que nos daría un resultado para cada recursión. En caso de que no lo sea, sí podemos hacerlo.
Código Python:
Ver original
@timeit def cuadrado(n): return n**2 print cuadrado(20)
Código:
Time:0.0000021458 sec 400
Añadimos algunas cosas más: El proceso PID y el consumo de RAM con el módulo resource.
Código Python:
Ver original
import resource import time import os def timeit(func): def timed(*args, **kw): ts = time.time() pid = os.getppid() result = func(*args, **kw) te = time.time() maxmem = (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)/1000 info = (pid, func.__name__, te-ts, maxmem) print('PID:{}\nName:{}\nTime:{:.10f} sec\nRAM:{} MB'.format(*info)) return result return timed
Si guardamos este archivo como por ejemplo decotime.py en el path correspondiente. Podemos importarlo desde nuetros programas
Código Python:
Ver original
import decotime @decotime.timeit def prueba(): return fibonacci(35) print prueba()
Con lo que, sobre la misma función anterior para fibonacci(35) obtengo:
Código:
fibonacci(40)PID:8833 Name:prueba Time:2.8051321507 sec RAM:92 MB 9227465
Código:
Y una versión con memoización de fibonacci:PID:8833 Name:prueba Time:31.0330379009 sec RAM:89 MB 102334155
Código Python:
Ver original
import decotime @decotime.timeit def main(n): mem = {1:1,2:1} def fibo(n): if n < 3: return 1 if not n in mem: mem[n] = fibo(n-1) + fibo(n-2) return mem[n] main(40)
Código:
La diferencia es espectacular...PID:8833 Name:prueba Time:0.0000319481 sec RAM:96 MB 102334155
Saludos.
Pd, no he encontrado en la documentación de resource nada sobre las unidades que devuelve ru_maxrss asi que no sé si esto es cierto :
maxmem = (resource.getrusage(resource.RUSAGE_SELF).ru_maxrs s)/1000
- Es posible que algunas cosas solo funcionen en *nix.