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