El día 6 de agosto de 2013 16:38, Daπid <davidmen...@gmail.com> escribió:
> 2013/8/6 Chema Cortes <pych...@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
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a