[Python-es] Eficiencia de las listas

Kiko kikocorreoso en gmail.com
Mie Ago 7 14:30:14 CEST 2013


mira también rot90, fliplr, flipud...

http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html#rearranging-elements

El 07/08/13, Chema Cortes <pych3m4 en gmail.com> escribió:
> 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
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>


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