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 < maeng...@gmail.com> escribió: > > > 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/ > > -- 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"
_______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/