Mejora de rendimiento
Alejandro Perez
perezj en si.uji.es
Vie Sep 19 08:15:33 CEST 2003
Buenos dias, he visto algunas cosas que se pueden mejorar :
On Thu, 2003-09-18 at 23:52, Tomás Javier Robles Prado wrote:
> Mezclando varias de las sugerencias propuestas:
>
> from sys import argv
> from time import strptime, mktime
>
> DATE_FORMAT = "%d/%b/%Y:%H:%M:%S +0200"
>
> def cmp (l1, l2):
> """Compara dos líneas de log de tipo apache según su fecha."""
> #Si las fechas son iguales, me da igual en que orden las pone
> if (l1[1] >= l2[1]) :
> return 1
> else :
> return -1
>
>
> def run (log, output):
> try:
> f = file (log, 'r')
> except IOError:
> print "No se ha podido abrir ", log
> return
>
> lineas = []
>
>
> print ("Leyendo de %s..." % log)
> #Se lee el fichero
> l = f.readline()
> while l != "":
>
> #Hay que intentar descartar líneas de este tipo:
> #127.0.0.1 34922 ==> 226 Transfer complete.
> #o este:
> #/usr/lib/zope/z2.py:385: UserWarning: You are running...
> try:
> if l.split()[1][0] == '-':
>
> #Esto se cumple si es un hit habitual
# split tiene un segundo parámetro (el número de veces que queremos
romper la cadena:
fecha = mktime(strptime(l.split('[',2)[1].split(']',1)[0] ,DATE_FORMAT))
>
> fecha = mktime(strptime(l.split('[')[1].split(']')[0] , DATE_FORMAT))
la siguiente linea se puede cambiar por: lineas.append((fecha, l)) y ya
no hace falta la función cmp para la ordenacion.
> lineas.append((l, fecha))
>
> except IndexError:
> pass
>
> l = f.readline()
>
> f.close()
>
> print ("Ordenando %d líneas..." % len(lineas))
>
> #Se ordena la lista
> lineas.sort(cmp)
Como resultado de la modificación anterior la linea anterior quedaría:
lineas.sort()
>
> print ("Guardando en %s..." % output)
> try:
> f = file(output, 'w')
> except IOError:
> print "No se ha podido abrir ", output
> return
>
>
>
> #Extraemos las lineas reales
> lineas = [x[0] for x in lineas]
> f.writelines(lineas)
> f.close()
>
> return
>
>
> Y probando con un archivo de 1000 líneas y midiendo tiempos con el
> módulo profile:
>
> versión original:
> >>> profile.run('pysort.run ("prueba.txt", "prueba-sort.txt")')
> Leyendo de prueba.txt...
> Ordenando 1000 líneas...
> Guardando en prueba-sort.txt...
> 1002 function calls in 0.300 CPU seconds
>
> Ordered by: standard name
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 1 0.000 0.000 0.300 0.300 <string>:1(?)
> 0 0.000 0.000 profile:0(profiler)
> 1 0.000 0.000 0.300 0.300 profile:0(pysort.run
> ("prueba.txt", "prueba-sort.txt"))
> 1 0.080 0.080 0.300 0.300 pysort.py:18(run)
> 999 0.220 0.000 0.220 0.000 pysort.py:8(cmp)
>
>
> versión con mejoras:
> >>> profile.run('pysort2.run ("prueba.txt", "prueba-sort.txt")')
> Leyendo de prueba.txt...
> Ordenando 1000 líneas...
> Guardando en prueba-sort.txt...
> 1002 function calls in 0.160 CPU seconds
>
> Ordered by: standard name
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 1 0.000 0.000 0.160 0.160 <string>:1(?)
> 0 0.000 0.000 profile:0(profiler)
> 1 0.000 0.000 0.160 0.160 profile:0(pysort2.run
> ("prueba.txt", "prueba-sort.txt"))
> 1 0.140 0.140 0.160 0.160 pysort2.py:17(run)
> 999 0.020 0.000 0.020 0.000 pysort2.py:8(cmp)
>
> Im-prezionante :)
>
> Aunque sigue petando con python2.3 ...
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es