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