[Python-es] Buscar, leer y escribir archivos grandes con Python

Andrey Antoukh andsux en gmail.com
Sab Jun 4 12:49:50 CEST 2011


Hola.
Me pareció muy interesante este hilo y he hecho unas cuantas pruebas con el
modulo IO de python3
Y en promedio me procesa un archivo de 70Mb en 1 segundo.

El código de la prueba: http://pastii.com.ar/1819

Andrei.
;)

El 4 de junio de 2011 04:18, Manuel Enrique González Ramírez <
maengora en gmail.com> escribió:

>
>
> El 3 de junio de 2011 14:19, Alexis Roda <alexis.roda.villalonga en 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 en 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 en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
http://twitter.com/andsux
http://www.niwi.be
****
http://www.freebsd.org/
http://www.postgresql.org/
http://www.python.org/
http://www.djangoproject.com/

"Linux is for people who hate Windows, BSD is for people who love UNIX"
"Social Engineer -> Because there is no patch for human stupidity"
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110604/042a1945/attachment.html>


Más información sobre la lista de distribución Python-es