> Supongo que esto es muy lento y que con el split habrás notado una
> buena mejoría. Pero todavía se puede hacer mejor, rsplit es lo suyo:
>
> In [9]: linea = "1|2011-05-20 23:08:56|122711527|OPERADOR1|HOST TO
> HOST|212454|10000|HOST CLIENTE|192630167"
>
> In [10]: timeit linea.split('|')[-1]
> 1000000 loops, best of 3: 1.2 us per loop
>
> In [11]: timeit linea.rsplit('|',1)[-1]
> 1000000 loops, best of 3: 695 ns per loop
>
> In [12]: linea.rsplit('|',1)[-1]
> Out[12]: '192630167'
>
> Para hacer esos mini-benchmarks tan chulos, se puede hacer facilmente
> con ipython.
>

Usando ipython defino tres funciones:

def abrekiko(entrada, salida):
    input = open(entrada, 'r')
    output = open(salida, 'w')
    for l in input:
        output.write(l.split(',')[-1])
    input.close()
    output.close()

def abrejoe(entrada,salida):
    with open(entrada,'r') as input:
        with open(salida,'w') as output:
            [output.write(l.split(',')[-1]) for l in input]

def abrelasi(entrada,salida):
    with open(entrada,'r') as input:
        with open(salida,'w') as output:
            [output.write(l.rsplit(',',1)[-1]) for l in input]

Los resultados que me salen son:
In [15]: timeit abrekiko(entrada,salida)
1 loops, best of 3: 735 ms per loop

In [16]: timeit abrejoe(entrada,salida)
1 loops, best of 3: 766 ms per loop

In [17]: timeit abrelasi(entrada,salida)
1 loops, best of 3: 563 ms per loop

Mi entrada es un fichero con 300.000 líneas y 8 columnas separadas por coma.

Claramente, rsplit parece que funciona mejor. He hecho mi función (abrekiko)
con una list comprehesion y también va un poquito más lenta que con el for a
pelo y tenía entendido que usar list comprehensions era más efectivo.

¿La diferencia de rsplit con respecto a split es solo que empieza el split
por la derecha?

¿Alguien tiene formas más rápidas de lectura de ficheros de texto?
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a