Opinion sobre los array en Python

Antonio Castro acastro en ciberdroide.com
Vie Abr 16 11:55:19 CEST 2004


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 en ciberdroide.com   |
+()()()---------()()()--------------------+




Más información sobre la lista de distribución Python-es