Re: [Python-es] Mapear un 'get_attr' [P]

2011-06-04 Por tema Edinson Padron



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

2011-06-04 Por tema Andrey Antoukh
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

2011-06-04 Por tema Andrey Antoukh
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-06-04 Por tema Carlos Zuniga
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-06-04 Por tema Carlos Zuniga
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/