Re: [Python-es] Mapear un 'get_attr' [P]
te refieres a getattr? getattr(x, 'att') lamentablemente no es a lo que me refiero, recuerdo que es semejante a lo siguiente: map(funcion('attr'), iterable) [x.att for x in iterable] lo considere, pero como map esta implementado en C, es mucho mas rápido que una list comprehension Gracias por tu tiempo, espero que alguien por alli tenga la respuesta :D ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Buscar, leer y escribir archivos grandes con Python
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|1|HOST CLIENTE|192630167 In [2]: timeit l.rsplit(|, 1)[-1] 100 loops, best of 3: 827 ns per loop In [3]: timeit l[l.rindex(|)+1:] 100 loops, best of 3: 676 ns per loop In [4]: timeit l[l.rfind(|)+1:] 100 loops, best of 3: 682 ns per loop In [5]: timeit l[-9:] 100 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:] 100 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 30 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/
Re: [Python-es] respuesta consulta python y sqlite
Hola. Ahora que leo este hilo, no me parece a mi que hay demasiadas respuestas (?) y todas prácticamente iguales...(?) En mi opinión con un par de distintas soluciones bastaría. O aun mejor, un enlace a la documentación y si después de haberla leído no entiende algo se pregunta. Un tiempo y un esfuerzo que se ahorra mucha gente. Escribir por llenar el espacio en el buzón de correo y el almacenamiento de la lista de correos no da ninguna recompensa. No es malo, pero es inútil. Un saludo. Andrei. El 2 de junio de 2011 03:54, Manuel Enrique González Ramírez maeng...@gmail.com escribió: Hola Jose, Gracias por tu consejo, ya el asunto estuvo solucionado con precisamente las instrucciones de Joe El 1 de junio de 2011 17:02, gerardo Juarez gerardojua...@buyteknet.infoescribió: Manuel, Ve lo que dice Joe. No he usado nunca SQLite, pero supongo que sigue la DB-API 2.0 de Python. Si ese es el caso, 'c' en tu código es un cursor y por lo tanto, como dice Joe, c.execute() ejecuta nada más el *query* . Luego tienes que obtener los datos con c.fetchall() o c.fetchone(). En el caso que pones en el que obtienes un sólo número, pasa como en este ejemplo: cur = db.cursor() cur.execute('select count(*) from articulos') # cuantos registros hay en esta tabla row = cur.fetchone() print row[0] # imprime cuantos registros obtuvo Esto es, aún siendo count(*) lo que quieres, te va a regresar un arreglo (o lista), por lo que lo recibes como tal y el número es el primer y único elemento de la lista (o arreglo). Lo que estás imprimiendo es el cursor mismo, por eso lo transforma a una representación imprimible y obtienes: sqlite3.Cursor object at 0x0126B4E0 Saludos Gerardo Manuel Enrique González Ramírez wrote: Perdón a todos, De los afanes me comí unas líneas de código (justos las del problema): # Consultemos los datos c.execute('SELECT * FROM tabla') for row in c: print row c.execute('select count(secuencia) from tabla') print 'Total transacciones: ',c El 1 de junio de 2011 16:25, joe di castro enxeb...@gmail.com mailto: enxeb...@gmail.com escribió: Por cierto la documentación que necesites sobre SQLite y sqlite3 la tienes aquí: http://docs.python.org/library/sqlite3.html#module-sqlite3 http://www.sqlite.org/ Saludos Joe El mié, 01-06-2011 a las 15:19 -0500, Manuel Enrique González Ramírez escribió: Saludos. Se me presenta un situación en la empresa para la que trabajo que quiero solucionar con un script de Python acompañado de SQLite. El asunto es que no tengo mucha experiencia con SQLite y al querer hacer un count de una tabla me arroja el resultado con el siguiente formato: sqlite3.Cursor object at 0x0126B4E0 El fragmento de codigo que me genera el resultado es este: c.execute('SELECT * FROM tabla') for row in c: print row Alguien me puede indicar como ver ese resultado en formato decimal?? La misma consulta la hago en el editor de sqlite (plugin de Mozilla) y me arroja el dato en el formato deseado; también me di una pasada por San Google pero no logro hallar documentación al respecto. A todos muchas gracias -- Manuel Enrique González Ramírez http://maengora.blogspot.com ___ Python-es mailing list Python-es@python.org mailto:Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org mailto:Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- 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
Re: [Python-es] Mapear un 'get_attr' [P]
2011/6/4 Edinson Padron edinson.padro...@gmail.com: te refieres a getattr? getattr(x, 'att') lamentablemente no es a lo que me refiero, recuerdo que es semejante a lo siguiente: map(funcion('attr'), iterable) ahh, un closure, tendrías que definir una función así: def getxattr(attr): def foo(x): return getattr(x,attr) return foo map(getxattr('attr'), iterable) No sé si ya existe esa función [x.att for x in iterable] lo considere, pero como map esta implementado en C, es mucho mas rápido que una list comprehension Estas seguro? un simple test me muestra que la list comprehension es mucho más rápida: import timeit timeit.timeit('map(lambda x: x.numerator, a)', 'a=(1,2,3,4)') 2.7023310661315918 timeit.timeit('map(getxattr, a)', a=(1,2,3,4) def getxattr(x): return x.numerator ) 2.5119788646697998 timeit.timeit(map(getxattr('numerator'),a), a=(1,2,3,4) def getxattr(attr): def foo(x): return getattr(x, attr) return foo ) 4.4668419361114502 timeit.timeit('[x.numerator for x in a]', 'a=(1,2,3,4)') 1.0678210258483887 Esto usando python 2.6 Saludos -- Linux Registered User # 386081 A menudo unas pocas horas de Prueba y error podrán ahorrarte minutos de leer manuales. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Mapear un 'get_attr' [P]
2011/6/4 Carlos Zuniga carlos@gmail.com: 2011/6/4 Edinson Padron edinson.padro...@gmail.com: te refieres a getattr? getattr(x, 'att') lamentablemente no es a lo que me refiero, recuerdo que es semejante a lo siguiente: map(funcion('attr'), iterable) ahh, un closure, tendrías que definir una función así: def getxattr(attr): def foo(x): return getattr(x,attr) return foo map(getxattr('attr'), iterable) No sé si ya existe esa función [x.att for x in iterable] lo considere, pero como map esta implementado en C, es mucho mas rápido que una list comprehension Estas seguro? un simple test me muestra que la list comprehension es mucho más rápida: import timeit timeit.timeit('map(lambda x: x.numerator, a)', 'a=(1,2,3,4)') 2.7023310661315918 timeit.timeit('map(getxattr, a)', a=(1,2,3,4) def getxattr(x): return x.numerator ) 2.5119788646697998 timeit.timeit(map(getxattr('numerator'),a), a=(1,2,3,4) def getxattr(attr): def foo(x): return getattr(x, attr) return foo ) 4.4668419361114502 Ligera modificación para evitar generar la función foo en cada iteración, pero la velocidad aún queda lejos... timeit.timeit('map(bar,a)', a=(1,2,3,4) def getxattr(attr): def foo(x): return getattr(x, attr) return foo bar=getxattr('numerator') ) 3.4971849918365479 ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/