Mejora de rendimiento
Tomás Javier Robles Prado
tjavier en usuarios.retecal.es
Jue Sep 18 23:52:06 CEST 2003
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
fecha = mktime(strptime(l.split('[')[1].split(']')[0] , DATE_FORMAT))
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)
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 ...
--
Un saludo,
Tomás Javier Robles Prado
http://milugar.doesntexist.org
------------ 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