[Python-es] Eficiencia de las listas

Chema Cortes pych3m4 en gmail.com
Mie Ago 7 13:28:00 CEST 2013


El día 6 de agosto de 2013 16:38, Daπid <davidmenhur en gmail.com> escribió:
> 2013/8/6 Chema Cortes <pych3m4 en gmail.com>:

> Por otro lado, si la operación de inversión no se hace sobre el array,
> sino sobre una copia, se gana tiempo:
>
> In [31]: l2 = l.copy()
>
> In [32]: %timeit l[i+1:j+1]=l2[j:i:-1]
> 10000 loops, best of 3: 101 us per loop

He mirado un poco mejor el funcionamiento de los arrays en numpy. Los
troceos no crean nuevos arrays, sino lo que llama "vistas" ("views")
(a excepción de los "fancy indexing" de numpy). Como las vistas están
enlazadas con el objeto original, los cambios en una vista se efectúan
directamente sobre el objeto original de forma eficiente.

Creo que usaré los arrays de numpy para operaciones con listas
grandes. También necesitaba hacer rotar la lista, cosa que veo que
puede hacer con np.roll, aunque no es tan eficiente como deque
.rotate() que realiza la operación "in-place".

Como curiosidad, había descartado algunas pruebas bizarras con deque,
pero muestra lo increiblemente rápido que puede llegar a ser:

d=deque(l)

%timeit d.rotate(-i-1);d.extendleft([d.popleft() for _ in
range(j-i)]);d.rotate(i+1)
10 loops, best of 3: 29.8 ms per loop

Es la misma operación que l[i+1:j+1]=l2[j:i:-1], primero rotando la
lista hacia la izquierda, añadiendo la lista invertida al principio y
volviendo a rotar hacia la derecha para mantener el mismo orden.


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es


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