El 3 de junio de 2011 14:19, Alexis Roda
<alexis.roda.villalo...@gmail.com>escribió:

> En/na Kiko ha escrit:
>
> En el programa que mandaste en el primer mensaje parece implícito que la
> longitud del código es siempre de 9 caracteres. Esto hace innecesario el uso
> de rsplit o rfind.
>
> def procesa(entrada, salida) :
>
>    with open(entrada,'r') as input:
>        with open(salida,'w') as output:
>            for l in input :
>                output.write(l[-9:])
>
> In [1]: l = "1|2011-05-20 23:08:56|122711527|OPERADOR1|HOST
> TOHOST|212454|10000|HOST CLIENTE|192630167"
>
> In [2]: timeit l.rsplit("|", 1)[-1]
> 1000000 loops, best of 3: 827 ns per loop
>
> In [3]: timeit l[l.rindex("|")+1:]
> 1000000 loops, best of 3: 676 ns per loop
>
> In [4]: timeit l[l.rfind("|")+1:]
> 1000000 loops, best of 3: 682 ns per loop
>
> In [5]: timeit l[-9:]
> 1000000 loops, best of 3: 208 ns per loop
>
> Fíjate en que utilizar rfind (o rindex) como hacías originalmente es mas
> eficiente que utilizar rsplit. La explicación es que rsplit crea dos cadenas
> (la "mitad" izquierda y la derecha), una lista con las dos cadenas y
> finalmente accede al último elemento de la lista. En la versión con rindex
> se crea directamente la cadena derecha.
>
> Como curiosidad, en el caso de utilizar un método de l podrías arañar unos
> nanosegundos haciendo algo como:
>
> In [6]: rf=l.rfind
>
> In [7]: timeit l[rf("|")+1:]
> 1000000 loops, best of 3: 602 ns per loop
>
> con esto evitas que el interprete tenga que buscar el método rfind de l en
> cada iteración.
>
>
>  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.
>>
>
> Las list comprehension sirven para crear listas. Lo que hace tu código es
> equivalente a:
>
> def abrelasi(entrada,salida):
>    lista = []
>
>    with open(entrada,'r') as input:
>        with open(salida,'w') as output:
>            for l in input :
>                lista.append(output.write(l.rsplit(',',1)[-1]))
>
> Al final "lista" contiene 300000 valores None. No le veo el sentido.
>
>
>  ¿Alguien tiene formas más rápidas de lectura de ficheros de texto?
>>
>
> Yo hubiese utilizado cut -d\| -f9 entrada.txt > salida.txt
>
> Como ya te han dicho debes considerar el tiempo de desarrollo mas el tiempo
> de ejecución y valorar si el esfuerzo extra vale la pena. Dicho esto, si
> quieres aprender, te recomendaría probar el módulo cProfile:
>
>  http://docs.python.org/library/profile.html#module-cProfile
>
> este modulo mide el tiempo de ejecución del programa y te ayudará a
> descubrir donde está el cuello de botella. Tal vez estés dedicando horas a
> optimizar algo que luego no tiene un impacto decisivo en el tiempo total de
> ejecución.
>
> En el caso de procesar el archivo tengo la impresión de que el problema
> estará en la E/S y no el el procesamiento de los datos en si (utilizando un
> programa razonable).
>
>
>
> Saludos
>
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>

Excelentísimos aportes de todos, si que se aprende!!

De verdad muuchas gracias, he seguido el hilo, cambiado el código y he
obtenido excelentes resultados.  Estos aportes están de lo máximo y si
continúa bienvenido sea el aprendizaje....

-- 
Manuel Enrique González Ramírez
http://maengora.blogspot.com
_______________________________________________
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