Mejora de rendimiento
luis miguel morillas
morillas en posta.unizar.es
Jue Sep 18 22:06:16 CEST 2003
Asunto: [Python-es] Mejora de rendimiento
Fecha: jue, sep 18, 2003 at 07:08:14 +0200
Citando a Tomás Javier Robles Prado (tjavier en usuarios.retecal.es):
> Hola,
>
> Estoy escribiendo un programilla que ordene por fecha las líneas de un
> fichero de log de Zope (que es básicamente igual que los de apache).
>
> Las funciones más relevantes del programa son:
>
>
> 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"""
> if mktime(strptime(l1.split('[')[1].split(']')[0] , DATE_FORMAT)) >
> mktime(strptime(l2.split('[')[1].split(']')[0] , DATE_FORMAT)) :
> return 1
> elif mktime(strptime(l1.split('[')[1].split(']')[0] ,
> DATE_FORMAT)) == mktime(strptime(l2.split('[')[1].split(']')[0] ,
> DATE_FORMAT)) :
> return 0
> else :
> return -1
>
Puedes utlizar la función predefinida cmp para evitarte líneas, pero entonces es
mejor que utilices otro nombre para la tuya.
def compara (l1,l2):
return cmp(mktime(strptime(l1.split('[')[1].split(']')[0] , DATE_FORMAT)) ,
mktime(strptime(l2.split('[')[1].split(']')[0] , DATE_FORMAT)))
> 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
for l in f.xreadlines():
# Utilza un for con xreadlines para optimizar los accesos
> 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
> lineas.append(l)
>
> except IndexError:
> pass
>
> l = f.readline()
>
> f.close()
>
> print ("Ordenando %d lineas..." % len(lineas))
>
> #Se ordena la lista
> lineas.sort(cmp)
lineas.sort(compara)
>
> print ("Guardando en %s..." % output)
> try:
> f = file(output, 'w')
> except IOError:
> print "No se ha podido abrir ", output
> return
>
> f.writelines(lineas)
> f.close()
>
> return
>
>
> El tiempo de ejecución con un fichero de unos 40 MB (157431 líneas) es
> desastroso. ¿A alguien se le ocurre alguna optimización útil? Tampoco me
> merece la pena usar psyco ni otros artificios extraños, ya que
> programaré el script para ejecutarse a las 4 d la mañana con prioridades
> bajas. Por cierto, ¿que algoritmo utiliza sort para ordenar?
>
> --
> Un saludo,
> Tomás Javier Robles Prado
> http://milugar.doesntexist.org
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
Un saludo
--
Luis Miguel
# Por un mundo con conocimiento libre #
No a las patentes de software
http://www.zaralinux.org - http://www.hispalinux.es
http://www.augustux.org
Más información sobre la lista de distribución Python-es