|
|
Subject: Re: Hexadecimal a Binario - msg#00097
List: python.general.castellano
Hola, he encontrado los siguiente en los Cookbook
( http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/219300):
binstr = lambda n: n>0 and bstr_pos(n>>1)+str(n&1) or ''
define una función para convertir de decimal a binario, entenoces de
hexadecimal a
binario sería
hex2binstr = lambda n: binstr(int(n,16))
Erny
Gari Araolaza escribió:
Oscar Merchan(e)k dio:
Muy buenas a todos/as.
Tan solo era preguntaros si alguien sabe como convertir cadenas en
hexadecimal a binarias y viceversa.
Seguro que hay algún módulo por ahí, pero para este caso concreto (hex
a bin) lo más rápido y sencillo puede ser un diccionario:
hxtobin = { '0':'0000', '1':'0001', '2':'0010', '3':'0011'...
Gari
_______________________________________________
Python-es mailing list
Python-es@xxxxxxxxxx
http://listas.aditel.org/listinfo/python-es
Was this page helpful?
Thread at a glance:
Previous Message by Date:
click to view message preview
RE: Opinion sobre los array en Python
On Fri, 16 Apr 2004, Hernan Foffani wrote:
> Antonio Castro escribio:
> > Me he decidido a hacer una comparación de eficiencia entre dos
> > programas que usan arrays de identicas características. Uno está
> > programa realizado en C y otro realizado en Python recurriendo
> > a una lista de listas. Es decir:
>
> tratando de no hacer hincapie en la violación de segmento de tu
> programa C, que lo solucionas poniendo un par de {} en el segundo
> for ;-), estas comparando cosas distintas.
Cierto falta las llaves. Y que hablamos de cosas distintas ya lo sé
pero es muy pertinente la comparación cuando te ves por narices obligado
a hacerlo todo con listas.
> para hacer la comparación equivalente deberías considerar como
> *minimo* que:
> 1. las listas de python son de tamaño dinámico. (vuelve a
> codificar los dos programas permitiendo que las pruebas se
> hagan con distintos tamaños especificados por linea de comandos)
> 2. las listas de python alojan objetos de cualquier tipo.
Tambien lo sé, pero precisamente por eso son ineficientes cuando lo
que se trata es de hacer algo muchísimo más sencillo.
> > Resumiendo. El programa C es unas 50 veces más rápido y estoy
> > seguro de que no estoy sorprendiendo a casi nadie con ello.
>
> a mí si.
> me sorprende que *solo* sea 50. ¿está bien hecha la prueba?
> hubiera jurado que un buen compilador C hubiera optimizado
> tu programa a un simple:
> main() { printf("Comienzo\n"); printf("End\n"); }
> ;-)
Tu fijate bien lo que estas diciendo. El código genera una serie de
instrucciones porque se produce un resultado en el interiora del array
(tabla1). Yo he optado por no sacar ni hacer nada con ese resultado
porque es un ejemplo. Queda bastante claro que no es un programa serio
pero con este ejemplo queda igualmente claro cual es el problema que
planteo. Bastaría con poner un problema concreto y decirte resuelvelo
de forma eficiente con Python. Si el problema se basa en el uso de arrays
no podrás hacerlo eficientemente en Python.
> > Yo creo que se podría incluir soporte para estructuras tipo array.
> >
> > Me pregunto si para no romper el enfoque dinámico de Python
> > lo suyo sería que hubiera que instanciar el objeto tabla pasandole
> > un elemento de muestra y una lista de tamaños un para cada
> > dimensión del array. Para un array de 1000x1000 sería algo así:
> >
> > tabla1=array(elem_muestra, 1000,1000)
>
> no cambiaría mucho. la unica ventaja es prealojar 1000x1000
> elementos. pero como un programa normal hace muchas mas cosas ese
> supuesto ahorro solo se obtiene una vez y de hecho es posible
> prealojar 1M de elementos en el python actual.
> recuerda que en C ese array se aloja en tiempo de *compilación*!
Para nada de acuerdo. Ese no es el problema. El alojamiento
podría hacerse dinamicamente en C con un malloc().
Acceder dentro de una estructura tipo array con elementos de
tamaños constante se implementa a nivel de generación de código
con una aritmética de punteros muy sencila y muy eficaz.
Una lista es otra cosa. Los elementos pueden ser heterogeneos,
puedes insertar y eliminar un elemento en cualquier posicion y
todo eso esta muy bien, pero tiene un precio que para ciertos casos
puede representar un serio problema de eficiencia.
Una lista puede implementar un array mientras que lo contrario no es
cierto, pero eso no es excusa para hacerlo todo con listas. Incluso
se pueden implementar otras muchas estructuras de datos, pilas, colas,
grafos, conjuntos, etc.. pero un array es algo muy básico y muy util a
mi modo de ver.
Para cavar prefiero usar una pala a una cuchara y para comer sopa
prefiero usar la cuchara a una pala.
> además, en el estado actual del parser/compilador/interprete de
> python, pasarle al constructor de la lista un "elem_muestra" es
> irrelevante. (hoy) no hay nada que pueda hacer mejor (o mas rapido)
> sabiendo que todos los elementos serán de tipo int o cualquier
> otra cosa.
Exacto lo has captado. Este es el problema de hoy.
> optimizar python no es sencillo. hay varias alternativas en
> uso y en estudio. desde generar codigo C a partir de anotaciones
> y/o extensiones al lenguaje hasta ideas sobre compiladores JIT.
>
> -H.
No sirve para este caso por las razones que dije en el mensaje
anterior. Si no se da algún soporte en el propio lenguaje el
resultado no será eficiente.
Hay multitud de casos donde usar una lista en lugar de un array es
un inconveniente muy serio y Python es un leguaje de propósito muy
general con una biblioteca de módulos impresionante. Sin los arrays
en mi opinión queda cojo.
--
Un saludo
Antonio Castro
/\ /\
\\W//
_|0 0|_
+-oOOO-(___o___)-OOOo---------------------+
| . . . . U U . Antonio Castro Snurmacher |
| . . . . . . . acastro@xxxxxxxxxxxxxxx |
+()()()---------()()()--------------------+
Next Message by Date:
click to view message preview
Re: Opinion sobre los array en Python
Para la galería, el programa en Python:
import Numeric
tabla1=Numeric.zeros((1000,1000))
print "Comienzo"
for y in xrange(1000):
for x in xrange(1000):
tabla1[y,x]=1
tabla1[x,y]=2
print "Fin"
marcos@renata:~$ time python xxnum.py
Comienzo
Fin
real 0m23.558s
user 0m20.731s
sys 0m0.154s
Por comparar, el programa en C (ya corregido con las llaves)
real 0m0.285s
user 0m0.127s
sys 0m0.066s
Unas 160 veces más lento.
Conclusiones:
* ¿Es Python un lenguaje adecuado para hacer bucles huecos? No.
* Pues no se me ocurre ninguna otra.
Antonio Castro wrote:
On Fri, 16 Apr 2004, Hernan Foffani wrote:
Antonio Castro escribio:
Me he decidido a hacer una comparación de eficiencia entre dos
programas que usan arrays de identicas características. Uno está
programa realizado en C y otro realizado en Python recurriendo
a una lista de listas. Es decir:
tratando de no hacer hincapie en la violación de segmento de tu
programa C, que lo solucionas poniendo un par de {} en el segundo
for ;-), estas comparando cosas distintas.
Cierto falta las llaves. Y que hablamos de cosas distintas ya lo sé
pero es muy pertinente la comparación cuando te ves por narices obligado
a hacerlo todo con listas.
para hacer la comparación equivalente deberías considerar como
*minimo* que:
1. las listas de python son de tamaño dinámico. (vuelve a
codificar los dos programas permitiendo que las pruebas se
hagan con distintos tamaños especificados por linea de comandos)
2. las listas de python alojan objetos de cualquier tipo.
Tambien lo sé, pero precisamente por eso son ineficientes cuando lo
que se trata es de hacer algo muchísimo más sencillo.
Resumiendo. El programa C es unas 50 veces más rápido y estoy
seguro de que no estoy sorprendiendo a casi nadie con ello.
a mí si.
me sorprende que *solo* sea 50. ¿está bien hecha la prueba?
hubiera jurado que un buen compilador C hubiera optimizado
tu programa a un simple:
main() { printf("Comienzo\n"); printf("End\n"); }
;-)
Tu fijate bien lo que estas diciendo. El código genera una serie de
instrucciones porque se produce un resultado en el interiora del array
(tabla1). Yo he optado por no sacar ni hacer nada con ese resultado
porque es un ejemplo. Queda bastante claro que no es un programa serio
pero con este ejemplo queda igualmente claro cual es el problema que
planteo. Bastaría con poner un problema concreto y decirte resuelvelo
de forma eficiente con Python. Si el problema se basa en el uso de arrays
no podrás hacerlo eficientemente en Python.
Yo creo que se podría incluir soporte para estructuras tipo array.
Me pregunto si para no romper el enfoque dinámico de Python
lo suyo sería que hubiera que instanciar el objeto tabla pasandole
un elemento de muestra y una lista de tamaños un para cada
dimensión del array. Para un array de 1000x1000 sería algo así:
tabla1=array(elem_muestra, 1000,1000)
no cambiaría mucho. la unica ventaja es prealojar 1000x1000
elementos. pero como un programa normal hace muchas mas cosas ese
supuesto ahorro solo se obtiene una vez y de hecho es posible
prealojar 1M de elementos en el python actual.
recuerda que en C ese array se aloja en tiempo de *compilación*!
Para nada de acuerdo. Ese no es el problema. El alojamiento
podría hacerse dinamicamente en C con un malloc().
Acceder dentro de una estructura tipo array con elementos de
tamaños constante se implementa a nivel de generación de código
con una aritmética de punteros muy sencila y muy eficaz.
Una lista es otra cosa. Los elementos pueden ser heterogeneos,
puedes insertar y eliminar un elemento en cualquier posicion y
todo eso esta muy bien, pero tiene un precio que para ciertos casos
puede representar un serio problema de eficiencia.
Una lista puede implementar un array mientras que lo contrario no es
cierto, pero eso no es excusa para hacerlo todo con listas. Incluso
se pueden implementar otras muchas estructuras de datos, pilas, colas,
grafos, conjuntos, etc.. pero un array es algo muy básico y muy util a
mi modo de ver.
Para cavar prefiero usar una pala a una cuchara y para comer sopa
prefiero usar la cuchara a una pala.
además, en el estado actual del parser/compilador/interprete de
python, pasarle al constructor de la lista un "elem_muestra" es
irrelevante. (hoy) no hay nada que pueda hacer mejor (o mas rapido)
sabiendo que todos los elementos serán de tipo int o cualquier
otra cosa.
Exacto lo has captado. Este es el problema de hoy.
optimizar python no es sencillo. hay varias alternativas en
uso y en estudio. desde generar codigo C a partir de anotaciones
y/o extensiones al lenguaje hasta ideas sobre compiladores JIT.
-H.
No sirve para este caso por las razones que dije en el mensaje
anterior. Si no se da algún soporte en el propio lenguaje el
resultado no será eficiente.
Hay multitud de casos donde usar una lista en lugar de un array es
un inconveniente muy serio y Python es un leguaje de propósito muy
general con una biblioteca de módulos impresionante. Sin los arrays
en mi opinión queda cojo.
Previous Message by Thread:
click to view message preview
Re: Hexadecimal a Binario
Oscar Merchan(e)k dio:
Muy buenas a todos/as.
Tan solo era preguntaros si alguien sabe como convertir cadenas en hexadecimal
a binarias y viceversa.
Seguro que hay algún módulo por ahí, pero para este caso concreto (hex a
bin) lo más rápido y sencillo puede ser un diccionario:
hxtobin = { '0':'0000', '1':'0001', '2':'0010', '3':'0011'...
Gari
Next Message by Thread:
click to view message preview
Opinion sobre los array en Python
Esto no es más que una opinión pero me gustaría que gente que
lleva más tiempo usando Python me diera su parecer.
Yo tengo una larga experiencia en C pero me he enamorado de
la elegancia, versatilidad y potencia del Python. Mi apuesta
por Python no puede ser más firme, e irreversible, pero hay
una cosa que me resulta especialmente chocante y es la no
inclusión de estructuras de arrays en el propio lenguaje.
Yo no cuestiono la potencia y versatilidad de uso que tienen
las listas pero no entiendo que en Python no se implementen
directamente estructuras de arrays que son extraordinariamente
eficientes. A mi no me parece que exista un solo impedimento
serio para implementar estas estructuras en el propio lenguaje.
Esto no se puede solucionar mediante un modulito porque no se trata
de añadir funcionalidad sino de aprovechar la facilidad que tienen
los procesadores para tratar con este tipo de datos.
Me he decidido a hacer una comparación de eficiencia entre dos
programas que usan arrays de identicas características. Uno está
programa realizado en C y otro realizado en Python recurriendo
a una lista de listas. Es decir:
---------------------------------------
#include <stdlib.h>
#include <stdio.h>
int tabla1[1000][1000];
int y, x;
main(){
printf ("Comienzo\n");
for (y=0; y<1000; y++)
for (x=0; x<1000; x++)
tabla1[y][x]=1;
tabla1[x][y]=2;
printf ("Fin\n");
}
$ time ./array1
Comienzo
Violación de segmento
real 0m0.052s
user 0m0.030s
sys 0m0.000s
------------------------------------------
#! /usr/bin/python
print 'Comienzo'
tabla1=[]
for y in range (1000):
aux1=[]
for x in range (1000):
aux1.append(0)
tabla1.append(aux1)
for y in range (4):
for x in range (15):
tabla1[y][x]=1
tabla1[x][y]=2
print 'Fin'
$ time ./array1.py
Comienzo
Fin
real 0m2.949s
user 0m2.930s
sys 0m0.020s
------------------------------------------
Resumiendo. El programa C es unas 50 veces más rápido y estoy
seguro de que no estoy sorprendiendo a casi nadie con ello.
Yo creo que se podría incluir soporte para estructuras tipo array.
Me pregunto si para no romper el enfoque dinámico de Python
lo suyo sería que hubiera que instanciar el objeto tabla pasandole
un elemento de muestra y una lista de tamaños un para cada
dimensión del array. Para un array de 1000x1000 sería algo así:
tabla1=array(elem_muestra, 1000,1000)
Evidentemente esto si se puede hacer e incluso se podría mejorar la
eficiencia haciendo uso de las posibilidades de combinar Python
con le lenguaje C, pero si luego para obtener el elemento x,y
tenemos que llamar a una función tipo val=tabla1.get(x, y)
o para alterar un elemento del array tenemos igualmente que hacer
tabla1.set(val, x, y) tendremos algo muy ineficiente porque en
lugar de acceder directamente a un dato estamos haciendo una llamada
a una funcion y metiendo y sacando datos en la pila, etc.
Por eso lo suyo sería que una vez instanciado el array como antes:
tabla1=array(elem_muestra, 1000,1000)
el propio lenguaje permitiera acceder a una posición x, y por ejemplo
mediante val=tabla1[x][y]
La sintaxis en este caso puede ser igual a la de una lista o si se
prefiere usar una sintaxis distinta pues estupendo pero en cualquier
caso, el acceso a los elementos de un array convendría implementarlos
en el propio lenguaje de una forma específica y directa.
Repito. Es una opinión.
--
Un saludo
Antonio Castro
/\ /\
\\W//
_|0 0|_
+-oOOO-(___o___)-OOOo---------------------+
| . . . . U U . Antonio Castro Snurmacher |
| . . . . . . . acastro@xxxxxxxxxxxxxxx |
+()()()---------()()()--------------------+
|
|