También depende de cuánto quieras invertir.

In [4]: l=np.random.random(3*10**6); L=list(l)
In [8]: i = int(10**5.8)
In [11]: j = 3*10**6-10
In [26]: %timeit l[i+1:j+1]=l[j:i:-1]
10 loops, best of 3: 23.4 ms per loop

In [27]: %timeit L[i+1:j+1]=L[j:i:-1]
1000000 loops, best of 3: 427 ns per loop

In this case, the list clearly beats NumPy, pero:


def flipper(K):
   ...:     i=10**4
   ...:     j=10**5
   ...:     K[i+1:j+1]=K[j:i:-1]
   ...:     return K

In [6]: %timeit flipper(l)             # NumPy array
1000 loops, best of 3: 311 us per loop
In [7]: %timeit flipper(L)           # Lista
100 loops, best of 3: 5.51 ms per loop

y, si quieres exprimirlo al máximo:

nflipper=numba.autojit(flipper)

In [10]: %timeit nflipper(l)
10000 loops, best of 3: 105 us per loop

In [11]: %timeit nflipper(L)
1 loops, best of 3: 5.52 ms per loop    # La lista no se optimiza

usando numba0.10.


David.

2013/8/6 Antonio Beamud Montero <antonio.bea...@gmail.com>:
> El 05/08/13 21:54, Chema Cortes escribió:
>
>> Últimamente, estoy realizando estudios sobre la eficiencia de
>> distintos códigos python. Mirando qué tipo de colección podía ser más
>> eficiente según qué tareas, me encuentro con el siguiente párrafo en
>> la documentación de ["deque"][1]:
>>
>> "Deques support thread-safe, memory efficient appends and pops from
>> either side of the deque with approximately the same O(1) performance
>> in either direction.
>>
>> Though list objects support similar operations, they are optimized for
>> fast fixed-length operations and incur O(n) memory movement costs for
>> pop(0) and insert(0, v) operations which change both the size and
>> position of the underlying data representation."
>>
>> He comprobado que, efectivamente, el costo de insertar elementos al
>> principio de una lista es mucho mayor que añadir elementos al final de
>> la lista (x10000).
>>
>> En estos momentos , necesito trabajar con listas de números muy largas
>> (> 10e6 elementos) para trocear en dos pedazos, invertir uno de ellos
>> y volverlos a empalmar (método "2-opt"). Una forma de expresarlo:
>>
>>     L[i+1:j+1] = L[j:i:-1]   con i+1<j
>>
>> que equivale a:
>>
>>     L[:i] + L[j:i:-1] + L[j+1:]
>>
>> Esta última expresión, aunque más clara, es poco eficiente al tener
>> que crear una nueva lista partiendo de tres sublistas intermedias.
>>
>> Los elementos no cambian de valor y tampoco cambia el tamaño de la
>> lista. Parece que la "lista" es la estructura más eficiente para esta
>> tarea (por lo que cuenta la documentación) siempre que no se modifique
>> en tamaño. Pero me pregunto si hay algún modo de hacer este manejo más
>> eficiente, tal vez usando alguna otra estructura, en python o numpy,
>> que mejore estas tareas de corte y empalme. Intuyo que con "arrays" se
>> reducen las necesidades de memoria, pero en estos momentos, la memoria
>> es lo que menos me preocupa. Busco un método genérico que pueda valer
>> para cualquier otro tipo de datos (eg: lista de vectores).
>>
>>
>
> Yo me decanté por usar numpy para resolver este tipo de problemas, aunque
> mis listas eran un orden de magnitud más pequeñas, después de hacer varias
> pruebas, el uso de las listas para operaciones simples, es tanto o más
> eficiente usando listas de python que crear arrays en numpy (bueno
> dependiendo de la operación), pero yo necesitaba métodos como 'diff',
> 'where', etc.. que si que marcaban diferencias respecto a mis anteriores
> implementaciones.
>
> Estaré muy atento a las conclusiones que llegues :-)
>
> Un saludo.
>
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
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