Opinion sobre los array en Python
Marcos Sánchez Provencio
rapto en arrakis.es
Vie Abr 16 21:11:16 CEST 2004
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 en 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.
>
>
>
>
Más información sobre la lista de distribución Python-es